将标识列重置为原始值

时间:2014-06-23 14:01:01

标签: sql sql-server auto-increment identity-column

有没有办法重新设置标识列的原始值?目前我有IDENTITY(1,1)作为我的表定义。我尝试使用这种方法重新种植它:

DBCC CHECKIDENT (Table1, reseed, 1)

但是我注意到,SQL实际上将它重新设置为当前种子+新的种子值,因此当我插入新行时,它会将自动增量计数开始为2而不是1.我还尝试制作新的重新设定值0,但之后我插入的所有行在结束后为1并且列不再自动递增。

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

3 个答案:

答案 0 :(得分:2)

以下声明:

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

告诉数据库类似于:

"嘿数据库! YourTableName 表中的最高标识值为#1,因此下一个插入的记录应使用标识值#2。"

这解释了为什么当你使用你的陈述重新使用它时你的表以身份值2开头。

更具体地说,Microsoft对 DBCC CHECKIDENT()的帮助表明:

  

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

     

如果表不为空,将标识值设置为小于标识列中的最大值的数字可能会导致以下条件之一:

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

听起来您想要将表格的初始种子值从1更改为0。考虑到这一点,您需要修改表的定义以使用:

IDENTITY(0,1);

我希望这会有所帮助。祝你好运。

答案 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作为RESEED值,则标识将从0开始,即

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

插入ID时输出0。

答案 2 :(得分: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