【问题标题】:Auto Increment feature of SQL ServerSQL Server 的自动增量功能
【发布时间】:2012-11-07 16:48:04
【问题描述】:

我创建了一个名为 ABC 的表。它有以下三列:-

number_pk(int) 列是我的表的主键,我在该表中为该列启用了auto increment 功能。

现在我从该表中删除了两行,例如 Number_pk= 5Number_pk =6

我现在得到的表是这样的:-

现在,如果我再次在此表中输入两个具有相同值的新行,我将得到两个新的 Number_pk starting from 7 and 8,即

我的问题是,这背后的逻辑是什么,因为我已经从表中删除了两行。我知道一个简单的答案是因为我已经为我的表的主键设置了自动增量。但我想知道有什么方法可以从最后一个 Number_pk 开始插入两个新条目而不改变我的表格设计?

以及自从我从数据库中删除行后,SQL Server 是如何管理这条记录的??

【问题讨论】:

  • 你为什么想要那个?有时需求并不是真正的需求
  • 我只是在检查它。并试图找到一个解决方案,因为可能存在主键的 int 已满的情况,然后我知道我们可以使用 BigInt。所以只是想,为什么我们不能利用未使用的呢?我不确定这是否可行,但只是我的查询:)
  • 是的,连续的 pk 很好,但肯定没有必要。
  • 是的,我知道我只是想知道 SQL Server 是如何实际管理它的(如果可能的话)!!
  • 如果您绝对想要一个解决方案,您可以将已删除的 id 存储在单独的表中,当您在代码中分配 id 编号时,您可以先从已删除的 ids 表中分配,然后再使用自动增量(如果已删除的 ids 表)是空的。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

逻辑保证生成的数字是唯一的。 ID 字段不一定必须具有含义,而是最常用于标识唯一记录,从而更容易对其执行操作。

如果您的数据库设计得当,如果已删除的 ID 号被外键关系中的任何其他表引用,则它们将无法删除,从而防止记录以这种方式成为孤立记录。

如果您绝对想要条目序列,您可以考虑发出RESEED,但正如建议的那样,它不会真正给您带来太多优势。

身份记录是“管理的”,因为 SQL Server 将跟踪已发出的号码,无论它们是否仍然存在。

如果您想从表中删除所有记录,有两种方法可以这样做(前提是不存在外键关系):

DELETE FROM Table

DELETE 只是删除记录,但下一个 INSERTED 值将在 ID 编号左侧的位置继续。

TRUNCATE TABLE

TRUNCATE 实际上会重新设置表,从而保证它以您最初指定的值(很可能是 1)重新开始。

【讨论】:

    【解决方案2】:

    虽然您不应该这样做,直到他们是一个特定的要求。

    1.) 获取最大id:

    Declare @id int
    Select @id = Max(Number_pk) From ABC
    SET @id = @id + 1;
    

    2.) 并重置身份列:

    DBCC CHECKIDENT('ABC', RESEED, @id)
    

    DBCC CHECKIDENT (Transact-SQL)

    【讨论】:

    • 如果您删除中间的行,这将不起作用。例如,如果您有第 1、2、3、4 行并且您删除 3,则最大值仍为 4。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2013-12-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多