SQL Server中IDENTITY列起始值为2而非1的原因咨询
为什么SQL Server的IDENTITY列从2开始而不是1?
嘿,我来帮你排查这个问题~你明明设置了IDENTITY(1,1),但插入的第一条数据id却是2,大概率是以下几个常见原因之一:
1. 曾经插入过数据又删除了
这是最常见的情况!比如你创建表后,可能不小心插入了一条id=1的记录,之后又把它删掉了。但SQL Server的IDENTITY计数器是不会因为删除记录而回滚的——它只记录下一个要分配的数值,不管之前的记录是否存在。举个例子:
-- 插入第一条记录,id自动分配为1 INSERT INTO test1(name, age) VALUES('测试', 20); -- 删除这条记录 DELETE FROM test1 WHERE id = 1; -- 再插入新记录,id就会是2 INSERT INTO test1(name, age) VALUES('shenmeshenqi', 20);
2. 事务回滚导致ID被消耗
如果你在插入第一条数据时用了事务,之后又回滚了,那分配出去的id=1也不会被回收。比如:
BEGIN TRANSACTION; INSERT INTO test1(name, age) VALUES('测试', 20); -- 此时id=1已被分配 ROLLBACK TRANSACTION; -- 回滚后记录没了,但计数器已经走到2 INSERT INTO test1(name, age) VALUES('shenmeshenqi', 20); -- 插入后id就是2
3. 不小心执行了重置IDENTITY种子的命令
如果表创建后,你(或者某个脚本/工具)执行了DBCC CHECKIDENT命令修改了种子值,也会导致这种情况。比如:
-- 把test1的IDENTITY种子重置为1,下一个插入的id就是1+1=2 DBCC CHECKIDENT('test1', RESEED, 1);
怎么验证当前的IDENTITY状态?
你可以执行这条命令查看当前的种子值和下一个要分配的ID:
DBCC CHECKIDENT('test1', NORESEED);
执行后会返回类似这样的结果:
Checking identity information: current identity value '3', current column value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
这里的current column value就是下一个要分配的id。
怎么解决?
如果想让后续插入的id从1开始(前提是表中没有数据或者可以清空数据),可以先清空表,再重置种子:
-- 清空表(会删除所有数据,谨慎操作!) TRUNCATE TABLE test1; -- 重置种子为0,下一个插入的id就是0+1=1 DBCC CHECKIDENT('test1', RESEED, 0);
如果表中已有数据不想删除,那只能接受当前的id序列,或者通过其他方式调整(但不建议随意修改已有的IDENTITY值)。
内容的提问来源于stack exchange,提问作者什么神奇
相关产品推荐
相关产品推荐

