【问题标题】:How to fix auto-increment not sequential after delete row in SQL database?如何在 SQL 数据库中删除行后修复自动增量不连续?
【发布时间】: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      |
+-----------+------------+

我该如何解决?我已经尝试过,但没有任何成功。谢谢。

【问题讨论】:

标签: c# sql-server auto-increment


【解决方案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 或任何控件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2015-09-28
        • 2020-03-12
        相关资源
        最近更新 更多