重置主键而不删除截断表

时间:2014-04-17 12:30:24

标签: sql-server sql-server-2012 primary-key

我有一个带有主键的表,现在没有任何理由我不知道何时插入数据它正在加载像这样

Pk_Col Some_Other_Col
1           A
2           B
3           C
1002        D
1003        E
1901        F

有没有办法可以像下面那样重置我的表,而不删除/截断表格?

Pk_Col Some_Other_Col
1           A
2           B
3           C
4           D
5           E
6           F

3 个答案:

答案 0 :(得分:1)

如果你真的,真的希望拥有整洁的身份值,你可以写一个光标(缓慢但可维护)或调查任何数量的"我怎样才能找到序列中的空白&#34 ;关于SO的问题并相应地执行UPDATE(运行得更快但是很难做到正确)。当您开始将外键指向此表时,这会变得指数级更难。准备好在任何时候将数据放入或从表中删除时重新运行此脚本。

修改IDENTITY列无法更新本身。但是,您可以SET IDENTITY_INSERT dbo.MyTable ON;INSERT包含所需IDENTITY值的行和现有行的其他列中的值,然后DELETE现有行。对数据的净影响与UPDATE相同。

执行此操作的唯一明智的理由是,如果您的表有大约20亿行,并且您的标识列即将耗尽整数。如果是这样的话,你也可以担心其他事情的全世界。

但是认真 - 听@Damien,不要担心。

答案 1 :(得分:1)

您无法更新IDENTITY列,因此DELETE / INSERT是唯一的方法。您可以重新设置IDENTITY列并重新创建数据,如下所示:

DBCC CHECKIDENT ('dbo.tbl',RESEED,0);    
INSERT INTO dbo.tbl (Some_Other_Col)
SELECT Some_Other_Col
FROM (DELETE FROM tbl OUTPUT deleted.*) d;

假设没有引用此数据的外键。

答案 2 :(得分:0)

ALTER TABLE #temp1
DROP CONSTRAINT PK_Id

ALTER TABLE #temp1
DROP COLUMN Id

ALTER TABLE #temp1
ADD  Id int identity(1,1)

试试这个。