我有一个带有标识集的 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)
检查身份信息:当前身份值“NULL”,当前列值“NULL”。
我知道解决这个问题的几种方法;我首先需要知道桌子是如何进入这种状态的?
我知道CHECKIDENT
返回 null 的唯一方法是如果表刚刚创建,但随后IDENTITY(1,1)
被尊重并且INSERT
原因SCOPE_IDENTITY()
是1
.
0
或者,如果我强制-1
作为当前种子(DBCC CHECKIDENT (MyTable, RESEED, -1)
或 with ),我可以获得下一个 ID,SET IDENTITY_INSERT MyTable ON
但随后检查报告当前-1
种子(而不是 null),所以这不可能是发生的事情。
数据库是如何进入该列的状态IDENTITY(1,1)
,DBCC CHECKIDENT (MyTable, NORESEED)
返回 null,但下一个INSERT
原因SCOPE_IDENTITY()
是0
?