微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

Checking identity information: current identity value ‘NULL’,current column value ‘NULL’.

我知道几种解决方法;我需要知道桌子是如何进入这种状态的?

我知道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:

Checking identity information: current identity value ‘NULL’,current column value ‘NULL’.

但是下一个标识值将为0.这是documented behaviour,MSDN声明:

The current identity value is set to the new_reseed_value. If no rows have been inserted to the table since it was created,the first row inserted after executing DBCC CHECKIDENT will use new_reseed_value as the identity. Otherwise,the next row inserted will use new_reseed_value + 1. If the value of new_reseed_value is less than the maximum value in the identity column,error message 2627 will be generated on subsequent references to the table.

这仅适用于新创建/截断的表,其中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

原文地址:https://www.jb51.cc/mssql/74963.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐