我该如何重置SQL表的主键计数器并更新每行为新的主键?
我该如何重置SQL表的主键计数器并更新每行为新的主键?
我会先给表添加另一列,将其用新的主键填充。
然后使用update语句来更新所有相关表中的新外键字段。
然后可以删除旧的主键和旧的外键字段。
编辑:是的,正如Ian所说,您将不得不删除并重新创建所有外键约束。
不确定您使用的是哪种数据库管理系统,但如果是SQL Server:
SET IDENTITY_INSERT [MyTable] ON
允许您更新/插入主键列。然后,当您完成更新键(如果逻辑复杂,可以使用CURSOR)时。
SET IDENTITY_INSERT [MyTable] OFF
这可能与 MS SQL 有关,但不一定是专属的: TRUNCATE TABLE 会重置 identity 计数器,因此一种快速且简单的方法是: 1)备份 2)将表内容复制到临时表中: 3)将临时表内容复制回具有 identity 列的表:
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
你为什么要费心呢?计数器为基础的“身份”主键的整个意义在于数字是任意和无意义的。
如果这是微软的SQL Server,您可以使用[dbcc checkident](http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)来解决问题。
假设您有一个要在其中移动数据并重新编号主键的单个表。例如,表的名称为ErrorCode。它有两个字段,ErrorCodeID(它是主键)和Description。
-- 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。
希望这有点帮助!