我有一些表,我正在尝试重新设置一个标识列。重播工作(我认为)但是当一个新数据项插入到表中时,标识列从0开始。
我的重新编码代码是:
DBCC CHECKIDENT(MyTable,RESEED,0)
表格的标识规范是:
快速注释 我正在重播前对表格执行删除
请帮忙
答案 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>