如何重置sql表上的主键计数器并使用新的主键更新每一行?
答案 0 :(得分:14)
我会先在表格中添加另一列,然后用新的PK填充。
然后我将使用update语句更新所有相关表中的新fk字段。
然后你可以删除旧的PK和旧的fk字段。
编辑:是的,正如Ian所说,您必须删除然后重新创建所有外键约束。
答案 1 :(得分:6)
不确定您使用的是哪个DBMS,但是它恰好是SQL Server:
SET IDENTITY_INSERT [MyTable] ON
允许您更新/插入主键列。然后,当您完成更新密钥时(如果逻辑很复杂,可以使用CURSOR)
SET IDENTITY_INSERT [MyTable] OFF
希望有所帮助!
答案 2 :(得分:2)
这可能与MS SQL无关,但是: TRUNCATE TABLE重置身份计数器,因此快速和脏的一种方法是 1)做备份 2)将表内容复制到临时表: 3)将临时表内容复制回表(具有标识列):
SELECT Field1, Field2 INTO #MyTable FROM MyTable
TRUNCATE TABLE MyTable
INSERT INTO MyTable
(Field1, Field2)
SELECT Field1, Field2 FROM #MyTable
SELECT * FROM MyTable
-----------------------------------
ID Field1 Field2
1 Value1 Value2
答案 3 :(得分:1)
你为什么要打扰?基于反制的“身份”主键的重点是数字是任意的,没有意义。
答案 4 :(得分:1)
您可以按以下步骤执行此操作:
但正如其他人所说,所有这些工作都不需要。 我倾向于查看身份类型主键,就好像它们等同于C中的指针一样,我使用它们来引用其他对象,但从不修改对它们的显式访问
答案 5 :(得分:-1)
如果这是Microsoft的SQL Server,您可以做的一件事是使用 [dbcc checkident](http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)
假设您有一个表要移动数据,同时重新编号主键。例如,表的名称是 ErrorCode 。它有两个字段, ErrorCodeID (这是主键)和描述。
-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 7000)
-- Move all rows greater than 8000 to the 7000 range
insert into ErrorCode
select Description from ErrorCode where ErrorCodeID >= 8000
-- Delete the old rows
delete ErrorCode where ErrorCodeID >= 8000
-- Reset the primary key counter
dbcc checkident(ErrorCode, reseed, 8000)
使用此示例,您将有效地将所有行移动到不同的主键,然后重置,以便下一个插入采用8000 ID。
希望这有点帮助!