SQL 数据库中删除行后如何修复自动递增不连续?

How to fix auto-increment not sequential after delete row in SQL database?

我有一个 table 使用 Microsoft SQL Server 2012

Name
+-----------+------------+
| IDName    | Name       |
+-----------+------------+
|1          | Doddy      |
|2          | Rinta      |
|3          | Krida      |
|4          | Debbie     |
+-----------+------------+

我设置 "IDName" 列并在 Identity Specification (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      |
+-----------+------------+

如果我删除一行,table会像这样

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      |
+-----------+------------+

我该如何解决?我试过但没有成功。谢谢。

你无法修复它。 SQL 服务器不会检查 table 的 ID "holes",因为它可能会降低性能。

如果你需要一个"serial number"字段,你必须实现这个逻辑。

事实上,这种逻辑并不经常需要。确保您确实需要序列号,因为它们的实现并不简单。

想想这些场景:

有4个连接同时插入Table。 3 连接为其插入启动事务,然后回滚事务。 1 个连接提交了他们的插入。

table中有8条ID为1-8的记录,我删除偶数ID的2、4、6、8。

不要担心漏洞,因为您无法阻止它们...

最好你写一个插入的过程。

在插入之前从 table 中获取最大值 IDName 并将 IDName+1 插入 table。

这是一个解决方法。如果您只是在删除时遇到问题,这将对您有所帮助。

我建议您不要更改数据库中的任何内容,因为可以在 运行 时间在您的 C# 程序中生成序列号以显示在 dataGridView 或任何控件中。