我使用
恢复数据库并删除my_table中的记录 delete from my_table;
然后我使用此查询重新设置了表标识列:
DBCC CHECKIDENT('dbo.my_table', reseed, 0);
我得到的信息是:
检查身份信息:当前标识值'NULL',当前列值'0'。
但是,当我使用此查询检查当前身份时:
DBCC CHECKIDENT ('my_table', NORESEED);
我收到了这条消息:
检查身份信息:当前标识值'NULL',当前列值'NULL'。
所以,当我在表中插入记录时,第一次插入会给我一个错误,但如果我再试一次,那么插入成功。
为什么我无法将当前标识列值设置为0?我需要先在表中插入标识值为1。
答案 0 :(得分:2)
相反,请使用:
truncate table my_table;
将自动重置标识列。 (另外,它比使用delete
)
如果表包含标识列,则为该列的计数器 重置为为列定义的种子值。如果没有种子 已定义,使用默认值1。要保留身份信息柜台, 改为使用DELETE。
答案 1 :(得分:1)
使用单个命令无法设置/重置标识列以涵盖表是否已插入记录的情况,这似乎很荒谬。在我偶然发现上面的问题之前,我无法理解我所经历的行为!
我的解决方案 - 丑陋但有效 - 是显式检查sys.identity_columns.last_value
表,它告诉你表是否插入了记录,并在每种情况下调用相应的DBCC CHECKIDENT
命令:
DECLARE @last_value INT = CONVERT(INT, (SELECT last_value FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'MyTable'));
IF @last_value IS NULL
BEGIN
-- Table newly created and no rows inserted yet; start the IDs off from 1
DBCC CHECKIDENT ('MyTable', RESEED, 1);
END
ELSE
BEGIN
-- Table has rows; ensure the IDs continue from the last ID used
DECLARE @lastValUsed INT = (SELECT ISNULL(MAX(ID),0) FROM MyTable);
DBCC CHECKIDENT ('MyTable', RESEED, @lastValUsed);
END