如何在 SQL 数据库中删除行后修复自动增量不连续?
Posted
技术标签:
【中文标题】如何在 SQL 数据库中删除行后修复自动增量不连续?【英文标题】:How to fix auto-increment not sequential after delete row in SQL database? 【发布时间】:2015-03-17 00:33:33 【问题描述】:我有一张使用 Microsoft SQL Server 2012 的表
Name
+-----------+------------+
| IDName | Name |
+-----------+------------+
|1 | Doddy |
|2 | Rinta |
|3 | Krida |
|4 | Debbie |
+-----------+------------+
我设置“IDName”列并在 Identity Spesification(Is Identity)中设置“Yes”,Identity increment = 1 和 identity seed = 1。所以,如果我插入新行,例如“Bobby”和“Tommy” , IDName 列自动插入
Name
+-----------+------------+
| IDName | Name |
+-----------+------------+
|1 | Doddy |
|2 | Rinta |
|3 | Krida |
|4 | Debbie |
|5 | Bobby |
|6 | Tommy |
+-----------+------------+
如果我删除一行,表格会是这样的
Name
+-----------+------------+
| IDName | Name |
+-----------+------------+
|1 | Doddy |
|2 | Rinta |
|3 | Krida |
|4 | Debbie |
|5 | Bobby |
+-----------+------------+
现在是我的问题。如果我添加一个具有相同或不同名称的新行,则 IDName 不会设置为 6,而是 7 这样。
Name
+-----------+------------+
| IDName | Name |
+-----------+------------+
|1 | Doddy |
|2 | Rinta |
|3 | Krida |
|4 | Debbie |
|5 | Bobby |
|7 | Tommy |
+-----------+------------+
如果我重新删除并重新插入,IDName 不是设置为 6 或 7,而是设置为 8。
Name
+-----------+------------+
| IDName | Name |
+-----------+------------+
|1 | Doddy |
|2 | Rinta |
|3 | Krida |
|4 | Debbie |
|5 | Bobby |
|8 | Tommy |
+-----------+------------+
我该如何解决?我已经尝试过,但没有任何成功。谢谢。
【问题讨论】:
这是自动增量列的正常行为。为什么需要 ID 为 6 而不是 8? 参考这个***来回答:***.com/questions/21824478/… 【参考方案1】:你最好试着写一个插入的过程。
在插入之前,从表中获取最大 IDName
并将 IDName+1
插入到表中。
这是一种解决方法。如果您仅在删除时遇到问题,这将很有帮助。
【讨论】:
当 2 个连接尝试同时插入时可能会出现问题。执行此操作时,您需要阻止其他插入... SQL Server 在内部处理它。数据库事务的 ACID 属性中的“I”定义了它。 我的意思是,如果 2 个连接同时执行此操作,它们可能都获得相同的 Max(IDName) 值,然后一个连接将无法插入。【参考方案2】:想想这些场景:
同时有 4 个连接插入到表中。 3 连接为其插入启动事务,然后回滚事务。 1 个连接提交其插入。
表中有8条ID为1-8的记录,我删除偶数ID为2、4、6、8的记录。
不要担心这些洞,因为你无法阻止它们......
【讨论】:
【参考方案3】:你无法修复它。 SQL Server 不会检查表中 id 的“漏洞”,因为它可能会降低性能。
如果你需要一个“序列号”字段,你必须实现这个逻辑。
事实上,这种逻辑并不经常需要。确保您确实需要序列号,因为它们的实现并非易事。
【讨论】:
【参考方案4】:我建议您不要更改数据库中的任何内容,因为序列号可以在运行时在您的 C# 程序中生成以显示在 dataGridView 或任何控件中。
【讨论】:
以上是关于如何在 SQL 数据库中删除行后修复自动增量不连续?的主要内容,如果未能解决你的问题,请参考以下文章