sql – 行为不端的身份

前端之家收集整理的这篇文章主要介绍了sql – 行为不端的身份前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
执行以下脚本,将表创建并填充到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

现在让我们在Identity列中强制使用几个值.

SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
    RegionId      int             IDENTITY(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,('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)适用于表中的第一行

由于您已经插入了两行,因此种子不再适用

下一个身份算法是在检测到表中存在现有记录时向种子开始添加一个,因为1可能已经被使用过.

原文链接:https://www.f2er.com/mssql/74832.html

猜你在找的MsSQL相关文章