我希望有一个简单(自动)枚举行序列的列。 所以我有这张桌子:
Nr Name
1 Test
2 Test2
3 Abc
4 Def
我首先删除最后一行,然后添加一行。问题是该表看起来像这样:
Nr Name
1 Test
2 Test2
3 Abc
5 Ghi
如何用4来恢复?
答案 0 :(得分:4)
正式答案是您重新设定了价值。 Here是对该怎么做的一种描述。
但真正的答案是不要担心。身份值不保证是顺序的,并且出现间隙的原因有多种。即使没有删除。你应该习惯自动增量身份的空白。
如果您需要连续无差距的值,则有解决方案。一个是计算输出值:
row_number() over (partition by id)
效果很好。
另一种是编写触发器来强制执行您想要的所有规则。但是,您知道,编写数据库引擎的人都知道每个人都希望身份无间隙。但是,他们可能不希望受到性能影响以保证这一点,因此他们在功能和性能方面有合理的妥协。如果您尝试在没有间隙的情况下强制执行顺序,则会影响性能,尤其是对于高容量插入和删除。
答案 1 :(得分:1)
您不能(使用自动递增值)。自动增量值,它的名字告诉你:它在每次插入后自动递增(在每个INSERT ... ON DUPLICATE KEY UPDATE
语句之后,即使它是更新案例)。
你可以手动设置下一个自动增量值,是 - 但这样做只会导致问题,因为在重新使用id 4后,mysql会继续使用id 5 - >已经存在 - >错误。
如果你真的需要没有间隙的id,你可以生成它们,但你应该保留代理id以供内部参考。 (只有那个和自然键才能可靠地处理数据)
但是创建一个可靠重用id的系统很难 - 尤其是在运行时,多个客户端实际使用数据的情况下。您需要花费大量时间来同步ID的使用 - 每个表!
ids是 nothing ,用户应与之联系。用户不应该有任何不同的体验,无论元素的id是3还是3487563673.如果只是在枚举中显示连续数字,你应该使用基于程序语言的变量,或者mysqls {{ 1}}函数获取显示信息。
答案 2 :(得分:1)
简短回答:不要这样做
至少,不要使用键 - 键应该稳定。
存在性能问题(通过原子方式的外键关系级联更新的键值 - 此处包含其他答案)以及逻辑问题(例如,存储在数据库系统外部的数据)。
例如,使用上面的数据,删除'Def'(id为4)的行,然后将'Ghi'的行重新编号为id 4(它是id 5)。当客户'Ghi'手机并引用5键时会发生什么情况,因为这是他们为客户ID录制的内容?客户'Def'访问时会发生什么,并带有显示4键的打印发票?
例如,每当其中一位客户切换到另一家银行时,您的银行是否会为您提供新的银行帐号?
查询时的行号
如果你想要一个'行号'概念,那么在查询时使用row_number()
生成一个(在SQL Server 2005中添加)。
SELECT row_number(), <other columns>
FROM schema.table
ORDER BY <ordering criteria> ;
-- or
SELECT row_number() OVER ( ORDER BY <ordering criteria> ), <other columns>
FROM schema.table ;