SQL标识(1,1)从0开始
我有一个带有标识集的SQL表:
CREATE TABLE MyTable( MyTableID int IDENTITY(1,1) NOT NULL,RecordName nvarchar(100) NULL) 这张桌子发生了什么事,导致奇怪的行为.我需要找出什么. 发生插入时: INSERT MyTable(RecordName) VALUES('Test Bug') SELECT SCOPE_IDENTITY() -- returns 0 SELECT * FROM MyTable -- displays: 0,'Test Bug' 这是一个问题,因为此插入上方的代码需要第一个ID为1 – 我无法弄清楚IDENTITY(1,1)如何以0结尾. 如果(在执行INSERT之前)我检查它返回null的标识: DBCC CHECKIDENT (MyTable,NORESEED)
我知道几种解决方法;我需要知道桌子是如何进入这种状态的? 我知道CHECKIDENT返回null的唯一方法是,如果刚创建了表,但是IDENTITY(1,1)被尊重,INSERT导致SCOPE_IDENTITY()为1. 或者,如果我强制-1作为当前种子(DBCC CHECKIDENT(MyTable,RESEED,-1)或使用SET IDENTITY_INSERT MyTable ON),我可以得到0作为下一个ID但是然后检查报告当前-1种子(而不是null) ),这不可能是发生了什么. 数据库是如何进入列具有IDENTITY(1,1)的状态,DBCC CHECKIDENT(MyTable,NORESEED)返回null,但是下一个INSERT导致SCOPE_IDENTITY()为0? 解决方法我希望有人/某事已经运行:DBCC CHECKIDENT ('dbo.MyTable',0); 如果您运行以下内容: CREATE TABLE dbo.MyTable( MyTableID int IDENTITY(1,RecordName nvarchar(100) NULL ); DBCC CHECKIDENT ('dbo.MyTable',0); DBCC CHECKIDENT ('dbo.MyTable',NORESEED); 第二个CHECKIDENT仍然返回NULL:
但是下一个标识值将为0.这是documented behaviour,MSDN声明:
这仅适用于新创建/截断的表,其中sys.identity_columns中的last_value列仍为NULL.如上所述,如果要插入一行,删除它,然后重新设置为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',0); INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; -- OUTPUTS 1 TRUNCATE TABLE dbo.T; DBCC CHECKIDENT ('dbo.T',0); INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; -- OUTPUTS 0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |