您的位置:首页 > 数据库

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

2018-01-11 16:37 106 查看
sql自增主键溢出解决方案:

简单粗暴法

重置自增字段法

偷换ID法

笨方法

注意注意

简单粗暴法

适用于数据不重要的情况下,可以进行情况,建议先备份数据

第一种 清空所有数据

--直接释放所有数据
--不能用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了,变更列或者表都会特别耗时,不建议白天业务忙的时候执行。建议可以去除有一些时间过久的数据后再来操作。

二 除非特别自信,请务必做数据保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql int溢出 表数据