数据表自增主键(int)溢出解决方案整理
程序员文章站
2024-03-24 18:24:34
...
sql自增主键溢出解决方案:
简单粗暴法
适用于数据不重要的情况下,可以进行情况,建议先备份数据
第一种 清空所有数据
--直接释放所有数据
--不能用delete:TRUNCATE瞬间解决,DELETE会执行到你睡着,DELETE不会重置自增标识,达不到效果
TRUNCATE TABLE testaaa
第二种 删除表 重建 (用TRUNCATE就可以了,用drop就傻了)
第三种 直接把int 改成bigint,本来就bigint的看其他吧
ALTER TABLE dbo.testaaa
ALTER COLUMN 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.testaaa ON
INSERT 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=Name from sysobjects where Parent_Obj=OBJECT_ID('testaaa') and xtype='PK';
if @Pk is not null
begin
exec('Alter table testaaa Drop '+ @Pk)
end
--删除id
ALTER TABLE dbo.testaaa
DROP COLUMN id
--新增自增id
ALTER TABLE dbo.testaaa
ADD ID INT IDENTITY(1,1) NOT NULL
--创建主键
ALTER TABLE dbo.testaaa
ADD CONSTRAINT [PK_testaaa] PRIMARY KEY(id ASC)
笨方法
将本表数据备份到另外一张表内,再清空本表数据,然后再插回备份表的数据
--备份数据
SELECT * INTO testaaa_bak
FROM dbo.testaaa
--清空当前表数据
TRUNCATE TABLE testaaa
--返回当前数据
INSERT dbo.testaaa
( name )
SELECT name FROM testaaa_bak
--删除备份表
DROP TABLE dbo.testaaa_bak
注意!!!!注意
一 是你的数据都突破int了,变更列或者表都会特别耗时,不建议白天业务忙的时候执行。建议可以去除有一些时间过久的数据后再来操作。
二 除非特别自信,请务必做数据保存。
推荐阅读