【问题标题】:SQL reseeding works but auto increment starts at 0SQL 重新播种有效,但自动增量从 0 开始
【发布时间】:2010-07-02 18:05:52
【问题描述】:

我有一些表,其中包含我正在尝试重新设置的标识列。重新播种有效(我认为),但是当将新数据项插入表中时,标识列从 0 开始。

我要重新播种的代码是:

DBCC CHECKIDENT(MyTable, RESEED, 0)

表的身份规范是:

  • 标识增量 = 1
  • 身份种子 = 1

快速注意我在重新播种之前对表执行删除

请帮忙

【问题讨论】:

  • 如果您不需要记录,您可以发出 TRUNCATE TABLE 语句。它将删除记录并将身份重新启动为原始身份种子。
  • 不幸的是,大多数表都有外键约束,因此截断它们是行不通的。
  • 同样的事情发生在我身上。这是因为我截断了表格而不是删除它。

标签: sql identity


【解决方案1】:

使用该命令,您是在告诉 IDENTITY 将自己设置回 0 作为其新种子。

不会返回到原始定义 (IDENTITY(1,1)),而是返回到您在 DBCC 命令中作为第三个参数指定的值。

如果您想重新使用 1 作为种子值,请使用:

DBCC CHECKIDENT(MyTable, RESEED, 1)

如果你想去 100,使用:

DBCC CHECKIDENT(MyTable, RESEED, 100)

您使用DBCC CHECKIDENT 定义和设置的值将成为您在该表中插入行时用于IDENTITY 列的第一个新值。

当你查看MSDN Books Online documentation时,你可以看到:

DBCC CHECKIDENT 
( 
    table_name
        [ , { NORESEED | { RESEED [ ,new_reseed_value ] } } ]
)

new_reseed_value

是用作标识列当前值的新值。

所以实际上是你定义了IDENTITY 列的新值 - 如果你像在帖子中那样传入 0,它将是 0 - 毕竟这就是你所要求的......

【讨论】:

  • 哦,我的印象是 Identity 列的工作方式是,当插入发生时,它会采用 Identity 列的当前值并将其增加增量值。
  • 这是不正确的。我尝试用 1 为表重新设定种子,但是当插入发生时,新记录的 ID 为 2。
  • @mattgcon:是的,确实——你似乎是对的。在第二次检查时,您在 DBCC CHECKIDENT 中设置的种子值将首先增加,然后再用于 IDENTITY 值....
  • 我注意到的一件奇怪的事情是,在我用起始身份重新设定种子后,某些表实际上在插入新记录时从 1 开始,但有些从 0 开始
【解决方案2】:

我认为您正在寻找的是:

DBCC CHECKIDENT(MyTable, RESEED, -1)

这仅适用于表已增加,即行已添加然后删除。下一个插入的行现在将增加 0。

如果表没有行,请使用: DBCC CHECKIDENT(MyTable, RESEED, 0)

【讨论】:

    【解决方案3】:

    当种子初始化为 0 时,“未初始化”或截断的表(意味着从未向表中插入任何数据)似乎将从 0 开始。但是当数据已插入表中并使用删除时清除表格的所有行。重新设置为 0 只会使数据库的最后一个种子为 0,而下一个种子为 1。

    这里说的是复制问题的示例:

    -- Script to create a test table
    IF EXISTS(SELECT 1 FROM Information_Schema.Tables WHERE TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'SeedTest') BEGIN
    
        DROP TABLE SeedTest
    
    END
    
    -- Create a Test Seed Table
    CREATE TABLE [dbo].[SeedTest](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Value] [varchar](255) NOT NULL,
     CONSTRAINT [PK_SeedTest] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    -- When a table is truncated or "Not Initialized" (meaning no data EVER inserted)
    -- An initial reseed of 0 will make the first identity insert value = 0.
    DBCC CHECKIDENT (SeedTest, RESEED, 0)
    
    GO
    
    INSERT INTO SeedTest([Value]) VALUES('Test')
    SELECT * FROM SeedTest
    
    GO
    
    -- If you truncate the table and reseed the same effect will occur (first identity insert value = 0).
    TRUNCATE TABLE SeedTest
    
    GO
    
    DBCC CHECKIDENT (SeedTest, RESEED, 0)
    
    GO
    
    INSERT INTO SeedTest([Value]) VALUES('Test')
    
    SELECT * FROM SeedTest
    
    
    -- When Deleting records from a table (Foreign key constraints may prevent a truncate)
    -- Reseeding to 0 will set the last seed to 0 and make the next seed = 1
    DELETE FROM SeedTest
    
    GO
    
    DBCC CHECKIDENT (SeedTest, RESEED, 0)
    
    GO
    
    INSERT INTO SeedTest([Value]) VALUES('Test')
    SELECT * FROM SeedTest
    
    GO
    

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多