执行以下脚本,该脚本创建一个表并将其填充到您的dev数据库中。
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SELECT * FROM dbo.Region
您期望从良好的“身份”字段获得的输出。
RegionId RegionName
----------- ------------------
1 Region One
2 Region Two
现在,让我们将两个值强制输入到“标识”列中。
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-9, 'Unknown'),
(-99, 'N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SELECT * FROM dbo.Region
输出是
RegionId RegionName
----------- ------------------
-9 Unknown
-99 N/A
2 Region One
3 Region Two
RegionId = 1 去哪里了?
编辑在进一步研究中,如果您尝试两次相同的特技,则Sql-Server不会跳过任何内容
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-9, 'Unknown'),
(-99, 'N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-999, 'Known-Unknown'),
(-9999, 'Really N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region Four'),
('Region Five');
GO
SELECT * FROM dbo.Region
这里的输出是
RegionId RegionName
----------- ------------------
-9 Unknown
-99 N/A
2 Region One
3 Region Two
-999 Known-Unknown
-9999 Really N/A
4 Region Four
5 Region Five
在前一种情况下,
1
丢失了。这里4
没有丢失!因此,现在这是不可预测的,丢失的身份!
为什么 RegionId = 1 丢失了,但是 RegionId = 4 却没有丢失?
最佳答案
IDENTITY(1,1)
适用于表中的FIRST行
由于您已经插入了两行,因此种子不再适用
当下一个标识算法检测到表中存在记录(因为可能已经使用1)时,将在种子开始处添加一个。