数据表自增主键(int)溢出解决方案整理

2022-07-09 08:39:41

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了,变更列或者表都会特别耗时,不建议白天业务忙的时候执行。建议可以去除有一些时间过久的数据后再来操作。
二 除非特别自信,请务必做数据保存。

  • 作者:小广龙
  • 原文链接:https://blog.csdn.net/fengyunxuanhai/article/details/79035850
    更新时间:2022-07-09 08:39:41