我们都知道在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数据类型。>