8

如何重置 sql 表上的主键计数器并使用新的主键更新每一行?

4

6 回答 6

15

我会先在表中添加另一列,用新的 PK 填充它。

然后我会使用更新语句来更新所有相关表中的新 fk 字段。

然后你可以删除旧的 PK 和旧的 fk 字段。

编辑:是的,正如伊恩所说,您将不得不删除然后重新创建所有外键约束。

于 2008-10-23T14:45:46.957 回答
6

不确定您使用的是哪个 DBMS,但如果它恰好是 SQL Server:

SET IDENTITY_INSERT [MyTable] ON

允许您更新/插入主键列。然后当您完成更新密钥时(如果逻辑复杂,您可以使用CURSOR )

SET IDENTITY_INSERT [MyTable] OFF

希望有帮助!

于 2008-10-23T15:07:35.430 回答
3

这可能是也可能不是 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
于 2008-10-23T14:51:33.403 回答
1

你为什么还要打扰?基于计数器的“身份”主键的全部意义在于数字是任意且无意义的。

于 2008-10-23T15:20:49.570 回答
1

您可以按照以下步骤进行操作:

  • 使用额外的列 new_key 创建 yourTable 的副本
  • 使用 yourTable 中受影响的行以及所需的 new_key 值填充 copyOfYourTable
  • 暂时禁用约束
  • 更新所有相关表以指向 new_key 的值而不是 old_key
  • 从 yourTable 中删除受影响的行
  • SET IDENTITY_INSERT [yourTable] ON
  • 使用键的新正确值(来自复制表)再次插入受影响的行
  • SET IDENTITY_INSERT [yourTable] 关闭
  • 种子身份
  • 重新启用约束
  • 删除copyOfYourtable

但正如其他人所说,不需要所有这些工作。我倾向于将身份类型主键视为等同于 C 中的指针,我使用它们来引用其他对象,但从不显式修改或访问它们

于 2008-10-23T15:41:59.777 回答
-1

如果这是 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。

希望这个对你有帮助!

于 2008-10-23T16:10:15.053 回答