2014-06-23 65 views
0

是否有任何方法将标识列重新设置为原始值?目前我有这个IDENTITY(1,1)作为我的表格定义。我试着用这个方法补种它:将标识列重新设置为原始值

DBCC CHECKIDENT (Table1, reseed, 1)

但是我注意到,这实际的SQL它补种当前种子+新的种子值,所以当我插入新行启动自动增量次数在2而不是1.我也尝试使新的种子值为0,但后来插入的所有行最终为1,并且列不再自动递增。

顺便说一句,如果它有帮助,我需要此列重新启动其自动增加计数为零,因为我需要计数重新启动每个月。插入后为此设置了触发器,但重新播种给我带来一些麻烦。

+1

为什么要这样做? –

+0

在重新启动IDENTITY列的值之前,您是否删除/截断'Table1'? –

+0

我需要这样做,因为我需要跟踪传入的作业,我们的作业管理系统分为两部分识别每个作业:1.四位MMYY(例如0714 = 2014年7月)和2. 5位数字00001( IDENTITY列)。 5位数字必须在每个月改变时重新开始计数。我不删除或截断任何列。 – user3694592

回答

2

下面的语句:

DBCC CHECKIDENT('YourTableName', RESEED, 1); 

告诉数据库一个类似于:

“嘿数据库中YourTableName表中的最高标识值#1,所以下一个插入的记录应该使用身份值#2“。

这就是为什么当您使用您的语句RESEED它时,表格以标识值2开始的原因。

更具体地说微软的DBCC CHECKIDENT()帮助表示:

当前标识值设置为new_reseed_value。如果自创建之后没有行插入到表中,或者所有行都使用TRUNCATE TABLE语句删除,则在运行DBCC CHECKIDENT后插入的第一行使用new_reseed_value作为标识。否则,插入的下一行使用new_reseed_value +当前增量值。

如果表不是空的,同一性值设置为一个小于标识列的最大值可导致下列条件之一:

  • 如果PRIMARY KEY或UNIQUE约束存在在标识列上,将在稍后向表中插入操作时生成错误消息2627,因为生成的标识值将与现有值冲突。
  • 如果PRIMARY KEY或UNIQUE约束不存在,则后面的插入操作将导致重复的标识值。

这听起来像你想你的表的初始启动种子值改变从10。考虑到这一点,你需要修改表的定义使用:

IDENTITY(0,1); 

我希望这可以帮助。祝你好运。

0

不是一个真正的答案,但太长的评论,并涵盖了这个问题。

我也尝试使新种子值为0,但后来插入的所有行最终为1,并且列不再自动递增。

我不能重现此问题:

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL 
    DROP TABLE dbo.T; 

CREATE TABLE dbo.T(ID INT IDENTITY(1,1) NOT NULL); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1 

DELETE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1, I.E. RESEED TO 0 HAS WORKED FINE 

INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 2, SHOWS INCREMENT IS WORKING AS EXPECTED 

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL 
    DROP TABLE dbo.T; 

值得注意的是,然而,对于一个空表中标识将在0开始,如果您使用0作为RESEED值,即

TRUNCATE TABLE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 

将输出0作为插入的ID。

0

我相信唯一能做到这一点的方法就是将select所有的数据放到第二个表中。

然后你可以发出命令truncate table Table1

这将重置标识列。

然后,您将所有数据从临时存储重新插入主表(不插入旧标识)。

例...

注:上同时运行的每个代码块一个,沿途检查次数,不跑了整个事情 - 我已经离开了“危险”的位注释掉以防万一

/** select all columns but NOT the id into a temp location (dont use a # table) **/ 
SELECT col1, col2, col3, col4, col5 
INTO tmpTable 
FROM Table1 

/** before truncation, double check counts in both match!! **/ 
-- SELECT COUNT(2) FROM tmpTable 
-- SELECT COUNT(2) from Table1 

-- TRUNCATE TABLE Table1 

INSERT INTO Table1 
SELECT col1, col2, col3, col4, col5 
FROM tmpTable 

/** before you drop temp table, make sure Table1 is ok! **/ 
-- SELECT COUNT(2) FROM tmpTable 
-- SELECT COUNT(2) from Table1 

-- DROP TABLE tmpTable 

这是一个快速测试来演示 - 我插入8行,删除一个,然后重新插入。它们被正确地重新编号。

IF OBJECT_ID('DBO.TEST') IS NOT NULL DROP TABLE TEST 
IF OBJECT_ID('DBO.TMP') IS NOT NULL DROP TABLE TMP 

CREATE TABLE TEST ([ID] INT IDENTITY(1,1), [SOMESTRING] NVARCHAR(50)) 

INSERT INTO TEST([SOMESTRING]) 
SELECT 'HI' UNION 
SELECT 'THESE' UNION 
SELECT 'ARE' UNION 
SELECT 'SOME' UNION 
SELECT 'STRINGS' UNION 
SELECT 'JUST' UNION 
SELECT 'TO' UNION 
SELECT 'DEOMONSTRATE' 

SELECT * 
FROM TEST 

DELETE FROM TEST 
WHERE SOMESTRING='SOME' 

SELECT SOMESTRING 
INTO TMP 
FROM TEST 

TRUNCATE TABLE TEST 

INSERT INTO TEST 
SELECT SOMESTRING 
FROM TMP 

SELECT * FROM TEST