Kei*_*ith 7 sql t-sql sql-server identity dbcc
我有一个带有标识集的SQL表:
CREATE TABLE MyTable(
MyTableID int IDENTITY(1,1) NOT NULL,
RecordName nvarchar(100) NULL)
Run Code Online (Sandbox Code Playgroud)
这张桌子发生了什么事,导致奇怪的行为.我需要找出什么.
发生插入时:
INSERT MyTable(RecordName)
VALUES('Test Bug')
SELECT SCOPE_IDENTITY() -- returns 0
SELECT * FROM MyTable -- displays: 0, 'Test Bug'
Run Code Online (Sandbox Code Playgroud)
这是一个问题,因为这个插入上面的代码需要第一个ID 1- 我无法弄清楚如何IDENTITY(1,1)以此结束0.
如果(在执行之前INSERT)我检查身份,它返回null:
DBCC CHECKIDENT (MyTable, NORESEED)
Run Code Online (Sandbox Code Playgroud)
检查身份信息:当前标识值'NULL',当前列值'NULL'.
我知道几种解决方法; 我需要知道桌子是如何进入这种状态的?
我知道CHECKIDENT返回null 的唯一方法是,如果刚刚创建了表,但是后来IDENTITY(1,1)被尊重并且INSERT原因SCOPE_IDENTITY()是1.
或者,0如果我强制-1作为当前种子(DBCC CHECKIDENT (MyTable, RESEED, -1)或者SET IDENTITY_INSERT MyTable ON),我可以获得下一个ID 但是然后检查报告当前-1种子(而不是空),这样就不会发生什么了.
数据库是如何进入列所具有的状态IDENTITY(1,1),DBCC CHECKIDENT (MyTable, NORESEED)返回null,但下一个INSERT原因SCOPE_IDENTITY()是0什么?
Gar*_*thD 13
我希望有人/某事已经运行:
DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0);
Run Code Online (Sandbox Code Playgroud)
如果您运行以下内容:
CREATE TABLE dbo.MyTable(
MyTableID int IDENTITY(1,1) NOT NULL,
RecordName nvarchar(100) NULL
);
DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0);
DBCC CHECKIDENT ('dbo.MyTable', NORESEED);
Run Code Online (Sandbox Code Playgroud)
第二个CHECKIDENT仍然返回NULL:
检查身份信息:当前标识值'NULL',当前列值'NULL'.
但是,下一个标识值将为0.这是记录的行为,MSDN声明:
当前标识值设置为new_reseed_value.如果自创建表以来没有向表中插入任何行,则在执行DBCC CHECKIDENT后插入的第一行将使用new_reseed_value作为标识.否则,插入的下一行将使用new_reseed_value + 1.如果new_reseed_value的值小于标识列中的最大值,则将在对该表的后续引用上生成错误消息2627.
这仅适用于新创建/截断的表,其中last_value列sys.identity_columns仍为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', RESEED, 0);
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES;
-- OUTPUTS 1
TRUNCATE TABLE dbo.T;
DBCC CHECKIDENT ('dbo.T', RESEED, 0);
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES;
-- OUTPUTS 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22204 次 |
| 最近记录: |