IDENTITY INSERT 与自增列,两者之间有什么关系?

吉云

今儿个,咱来聊聊 SQL Server 里头一个有意思的玩意儿:IDENTITY_INSERT。这东西平时不咋起眼,但关键时候能派上大用场。先说说我为啥要折腾这个。

前两天,我手欠,不小心把数据库里几条挺重要的数据给删,删完我就傻眼。这几条数据,它们的 ID 是自增的,就是说数据库自己个儿给编的号,我平时插数据的时候压根儿不用管。这下好,数据没,ID 也空出来,直接插新数据,那 ID 就接不上,以后查起来乱套怎么办?

我就开始琢磨,能不能把这几条数据原封不动地插回去,连带着 ID 也给它恢复?

IDENTITY INSERT 与自增列,两者之间有什么关系?

刚开始,我直接用 INSERT 语句往里插,结果数据库“啪”地一下给我报个错,说“当 IDENTITY_INSERT 设置为 OFF 时,不能给自增列插值”。得,看来这路子走不通。

后来我查查资料,才知道有 IDENTITY_INSERT 这么个东西。这玩意儿就像个开关,默认是关着的(OFF),这时候你不能给自增列指定值。你要想手动插 ID,就得把它打开(ON)。

于是我赶紧把这开关给拨到 ON:


SET IDENTITY_INSERT 表名 ON;

IDENTITY INSERT 与自增列,两者之间有什么关系?

然后,再执行 INSERT 语句,这回成!数据连着 ID 都回来,跟我删之前一模一样。

不过这事儿还没完。数据插完,我还得把这开关给关回去,要不以后再插新数据,数据库还以为我要手动指定 ID ,那不又乱套?

一步:

IDENTITY INSERT 与自增列,两者之间有什么关系?

SET IDENTITY_INSERT 表名 OFF;

这下,整个过程才算圆满结束。数据恢复,ID 也对上,强迫症表示一本满足。

通过这回实践,我算是彻底搞明白 IDENTITY_INSERT 的用法。这玩意儿平时用不着,但关键时刻能救急。就像家里常备的工具箱,说不定啥时候就得用上。

IDENTITY INSERT 与自增列,两者之间有什么关系?

另外再补充两句。我查看的时候还发现有两个容易搞混的东西,一个是SCOPE_IDENTITY(),一个是@@IDENTITY。这两个东西都是用来获取插入的自增ID的,但是作用范围不太一样,SCOPE_IDENTITY() 就只管自己那一亩三分地里新插入的,别的它不管。@@IDENTITY,就比较厉害,整个数据库里只要有新插入的自增ID,都能被他查到,用的时候稍微注意点儿就好

这回折腾也算是个教训,提醒我以后操作数据库可得小心点儿,别再手欠。也让我学到新东西,以后再遇到类似的问题,咱就不慌。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]