欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » SQLServer教程 » 正文

热门阅读

SQL SERVER中自增量(标识列)重复原因分析

创建时间:2011年11月02日 16:33  阅读次数:(8605)
分享到:
我们都知道在SQL Server中,自增量(标识列)中的值是我们在插入数据时根据我们设置的起始值与阶步值自动赋值,但是不是这样标识列中就永远没有重复值呢?其实不是,SQL SERVER中允许存在重复的标识值,SQL Server也不会主动检查表中是否存在重复的标识值。

在以下两种情况下,SQL SERVER的标识列中,就会存在重复的值。
1,利用set identity_insert开关,强制插入重复的标识值。

关于set identity_insert的用法,请参看本站下面文章:
往自增列插入显式值-SET IDENTITY_INSERT详解

我们可以来做个示范:
先创建一个示例表:
create table tb
(
ID int identity(1,1),
test varchar(50)
)

然后往表tb中插入两条测试数据:
insert tb(test) values ('a')
insert tb(test) values ('b')

然后查看表中数据
ID test
1   a
2   b

这是正常的,没有重复的标识值,然后我们利用set identity_insert on强制插入重复标识值:
set identity_insert tb on
insert tb(id,test) values (1,'a')
insert tb(id,test) values (1,'a')
set identity_insert tb off

再来查看表中数据
ID test
1   a
2   b
1   a
1   a
这时候,表中就会有重复的标识值了,而且我们在执行上面SQL时也没有报错。

2,利用DBCC CHECKIDENT重置了当前标识值。
这个原因比较简单了,比如当前表中的标识值已经排到10了,这时候,我们重置当前标识值为1,那么新的标识列又会从1开始,所以这样表中也会产生重复的标识值。

关于DBCC CHECKIDENT的用法,请参看本站下面文章:
重置SqlServer表的自增列,让自增列重新开始记数

我们还是来做个示范,先利用truncate table来清空表tb中数据
先执行SQL语句truncate table tb清空表tb中的数据,并使自增量从1开始。

truncate table的用法,请参看本站:
Sql Server中truncate table与delete语句的区别

然后我们往表中插入三条测试数据
insert tb(test) values ('a')
insert tb(test) values ('b')
insert tb(test) values ('c')

查看表中的数据
ID test
1   a
2   b
3   c

然后我们利用CHECKIDENT重置当前标识值:
DBCC CHECKIDENT ('tb',RESEED,1)

然后再往表中插入一条新的数据
insert tb(test) values ('d')

查看表中数据
ID test
1   a
2   b
3   c
2   d

可以看到,新的标识值又从2开始了,而且表中产生了重复的标识值2。

总结:SQL SERVER中是可以存在重复的标识值的,如果要确保列中不存在重复值,请使用主键或唯一键约束,或者设置列为uniqueidentifier数据类型。>
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 83+80=? 的结果(结果是:163)
结  果: