如何在 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 数据库中删除行后修复自动增量不连续?的主要内容,如果未能解决你的问题,请参考以下文章

修复自动增量mysql [重复]

使用猫鼬生成自动增量字段?

取消选择数据表行后如何正确删除数组中的索引或值?

如何将自动增量 ID 重置为以前的 ID

SQLite):删除行后自动更新两个表中的索引

MySQL中删除后自动增量