SQL重新设定有效,但自动增量从0开始

时间:2010-07-02 18:05:53

标签: sql identity

我有一些表,我正在尝试重新设置一个标识列。重播工作(我认为)但是当一个新数据项插入到表中时,标识列从0开始。

我的重新编码代码是:

DBCC CHECKIDENT(MyTable,RESEED,0)

表格的标识规范是:

  • 身份增量= 1
  • Identity Seed = 1

快速注释 我正在重播前对表格执行删除

请帮忙

3 个答案:

答案 0 :(得分:6)

当种子初始化为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

答案 1 :(得分:4)

我认为你在寻找的是:

DBCC CHECKIDENT(MyTable, RESEED, -1)

仅当表已增加时,即已添加行然后删除。下一个插入的行现在将递增,给出0。

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

答案 2 :(得分: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 - 这就是你所要求的,毕竟... < / p>