sql自增主键溢出解决方案:
简单粗暴法
适用于数据不重要的情况下,可以进行情况,建议先备份数据
第一种 清空所有数据
--直接释放所有数据--不能用delete:TRUNCATE瞬间解决,DELETE会执行到你睡着,DELETE不会重置自增标识,达不到效果TRUNCATETABLE testaaa
第二种 删除表 重建 (用TRUNCATE就可以了,用drop就傻了)
第三种 直接把int 改成bigint,本来就bigint的看其他吧
ALTERTABLE dbo.testaaaALTERCOLUMN id BIGINT
重置自增字段法
适用于数据id顺序不重要的情况,保留了原数据,释放了空格数据
--重置表的自增字段,保留数据
DBCC CHECKIDENT(testaaa,reseed,0)--后面的这个0代表重置标识值
例子:
第一步:执行前的数据预览
第二步:执行本条语句
DBCC CHECKIDENT(testaaa,reseed,0)
第三步:插入一条数据
INSERT dbo.testaaa( name )VALUES ( N'ddddd')
测试:我们利用sql进行自增列显性插入(就是手动指定id值,非系统自动分配)
-- 设置允许显式插入自增列SET IDENTITY_INSERT dbo.testaaaONINSERT dbo.testaaa
( id,name )VALUES (2147483647,N'aaa')
-- 当然插入完毕记得要设置不允许显式插入自增列SET IDENTITY_INSERT dbo.testaaa Off
结果表明当前列值已进行了更新,不能继续溢出插入数值
注意注意:此种方法的弊端,数据id触碰问题!!!!!
偷换ID法
相当于删除原有id,重置所有id数据,适用于id不重要
--删除原有主键
DECLARE @Pk varChar(100);Select @Pk=Namefrom sysobjectswhere Parent_Obj=OBJECT_ID('testaaa')and xtype='PK';
if @Pk is not nullbeginexec('Alter table testaaa Drop '+ @Pk)end
--删除idALTERTABLE dbo.testaaaDROPCOLUMN id
--新增自增idALTERTABLE dbo.testaaaADD IDINTIDENTITY(1,1)NOTNULL
--创建主键ALTERTABLE dbo.testaaaADDCONSTRAINT [PK_testaaa]PRIMARYKEY(idASC)
笨方法
将本表数据备份到另外一张表内,再清空本表数据,然后再插回备份表的数据
--备份数据SELECT *INTO testaaa_bakFROM dbo.testaaa
--清空当前表数据TRUNCATETABLE testaaa
--返回当前数据INSERT dbo.testaaa
( name )SELECT nameFROM testaaa_bak
--删除备份表DROPTABLE dbo.testaaa_bak
注意!!!!注意
一 是你的数据都突破int了,变更列或者表都会特别耗时,不建议白天业务忙的时候执行。建议可以去除有一些时间过久的数据后再来操作。
二 除非特别自信,请务必做数据保存。