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 或任何控件中。
我有一个 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 或任何控件中。