2010-07-02 75 views
3

我有一些表,有一个标识列,我尝试种。补种工作(我认为),但是当一个新数据项插入到表中标识列在0SQL重新播种工作,但自动增量从0开始

我的代码开始补种是:

DBCC CHECKIDENT(MyTable的,RESEED,0)

为表中的身份的规格是:

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

快速注我要补种

执行对表一个删除前请帮

+0

如果您不需要记录,你可以发出TRUNCATE TABLE语句。它会删除记录并将身份开始回到原始身份种子。 – 2010-07-02 18:53:33

+0

不幸的是,大多数表都有外键约束,所以截断它们将不起作用。 – mattgcon 2010-07-06 15:52:23

+0

同样的事情发生在我身上。这是因为我截断了表而不是删除它。 – 2014-03-20 10:27:47

回答

1

使用该命令,你告诉身份来为自己回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 - 这就是你问什么,毕竟...

+0

呵呵,我的印象是,Identity列的工作方式是,当Insert发生时,它采用Identity列的当前值并通过增量值递增。 – mattgcon 2010-07-02 18:15:30

+1

这是不正确的。我尝试用1重新编入表格,但是当插入发生时,新记录的ID为2. – mattgcon 2010-07-06 15:45:28

+0

@mattgcon:是的,的确 - 您似乎是对的。第二次检查时,您在DBCC CHECKIDENT中设置的种子值将在用于IDENTITY值之前首先增加.... – 2010-07-06 15:51:06

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 
3

我知道你在寻找的是:

DBCC CHECKIDENT(MyTable, RESEED, -1) 

这是只有在表已经增加,也就是行已被添加,然后被删除。接下来插入的行现在将增加给予0

在这种情况下该表没有行,使用: DBCC CHECKIDENT(MyTable的,RESEED,0)