如何重置 sql 表上的主键计数器并使用新的主键更新每一行?
6 回答
我会先在表中添加另一列,用新的 PK 填充它。
然后我会使用更新语句来更新所有相关表中的新 fk 字段。
然后你可以删除旧的 PK 和旧的 fk 字段。
编辑:是的,正如伊恩所说,您将不得不删除然后重新创建所有外键约束。
不确定您使用的是哪个 DBMS,但如果它恰好是 SQL Server:
SET IDENTITY_INSERT [MyTable] ON
允许您更新/插入主键列。然后当您完成更新密钥时(如果逻辑复杂,您可以使用CURSOR )
SET IDENTITY_INSERT [MyTable] OFF
希望有帮助!
这可能是也可能不是 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
你为什么还要打扰?基于计数器的“身份”主键的全部意义在于数字是任意且无意义的。
您可以按照以下步骤进行操作:
- 使用额外的列 new_key 创建 yourTable 的副本
- 使用 yourTable 中受影响的行以及所需的 new_key 值填充 copyOfYourTable
- 暂时禁用约束
- 更新所有相关表以指向 new_key 的值而不是 old_key
- 从 yourTable 中删除受影响的行
- SET IDENTITY_INSERT [yourTable] ON
- 使用键的新正确值(来自复制表)再次插入受影响的行
- SET IDENTITY_INSERT [yourTable] 关闭
- 种子身份
- 重新启用约束
- 删除copyOfYourtable
但正如其他人所说,不需要所有这些工作。我倾向于将身份类型主键视为等同于 C 中的指针,我使用它们来引用其他对象,但从不显式修改或访问它们
如果这是 Microsoft 的 SQL Server,您可以做的一件事是使用[dbcc checkident]( http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)
假设您有一个要在其中移动数据并重新编号主键的表。例如,表的名称是ErrorCode。它有两个字段,ErrorCodeID(主键)和Description。
使用 dbcc checkident 的示例代码
-- 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。
希望这个对你有帮助!