执行以下脚本,该脚本创建一个表并将其填充到您的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)时,将在种子开始处添加一个。

10-06 03:08