我有一个带有主键的表,现在没有任何理由我不知道何时插入数据它正在加载像这样
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
答案 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)
试试这个。