尽管你可以对标识列(identity column)的值及其任意值的用处有千条万条理由但是和你共同工作的一些人会坚持在给定的表格里使用连续的主关键字(PK)然后当发票号丢失的时候他们就会恐慌害怕被起诉掩盖错误甚至更糟
为了解决这个问题你可以创建一个带有标识列的表格并用一些数据行来填充它
Create a test table
CREATE TABLE TestIdentityGaps
(
ID int IDENTITY PRIMARY KEY
Description varchar()
)
GO
Insert some values The word INTO is optional:
INSERT [INTO] TestIdentityGaps (Description) VALUES (One)
INSERT [INTO] TestIdentityGaps (Description) VALUES (Two)
INSERT [INTO] TestIdentityGaps (Description) VALUES (Three)
INSERT [INTO] TestIdentityGaps (Description) VALUES (Four)
INSERT [INTO] TestIdentityGaps (Description) VALUES (Five)
INSERT [INTO] TestIdentityGaps (Description) VALUES (Six)
GO
现在删除几个数据行
DELETE TestIdentityGaps
WHERE Description IN(Two Five)
在我们编写代码的时候我们知道二(Two)和五(Five)这两个值丢了我们想要插入两个数据行来填补这些空缺两个简单的INSERT陈述式无法满足要求但是它们会在序列的结尾创建主关键字
INSERT [INTO] TestIdentityGaps (Description)
VALUES (Two Point One)
INSERT [INTO] TestIdentityGaps
(Description) VALUES (Five Point One)
GO
SELECT * FROM TestIdentityGaps
你也无法明确地设置标识列的值
Try inserting an explicit ID value of Returns a warning
INSERT INTO TestIdentityGaps (id Description)
VALUES( Two Point One)
GO
为了解决这个问题SQL服务器用IDENTITY_INSERT来进行设置为了强行插入一个带有特定值的数据行你需要发出命令然后在后面接上具体插入的内容
SET TestIdentityGapsON
INSERT INTO TestIdentityGaps
(id Description) VALUES( Two Point One)
INSERT INTO TestIdentityGaps
(id Description) VALUES( Five Point One)
GO
SELECT * FROM TestIdentityGaps
现在你可以看到新的数据行已经用指定的主关键字值插入了
注意对IDENTITY_INSERT的设置可以在任何特定的时候用在数据库里的某个表格上如果需要在一个或者多个表格里填补空缺你就必须用具体的命令来明确地指明每个表格
你可以在一个带有标识列的表格里插入一个具体的值但是要这样做的话你必须首先把IDENTITY_INSERT的值设置为ON如果你没有你就会看到一条错误消息即使你把IDENTITY_INSERT的值设置为了ON但是如果再插入一个已有的值的话你还是会看到错误消息