重新编号主键

时间:2008-10-23 14:42:50

标签: sql primary-key

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

6 个答案:

答案 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)

您可以按以下步骤执行此操作:

  • 使用附加列new_key
  • 创建yourTable的副本
  • 使用yourTable中受影响的行填充copyOfYourTable以及所需的new_key值
  • temporarily disable constraints
  • 更新所有相关表以指向new_key的值而不是old_key
  • 从yourTable中删除受影响的行
  • SET IDENTITY_INSERT [yourTable] ON
  • 使用新的正确密钥值(来自复制表)再次插入受影响的行
  • SET IDENTITY_INSERT [yourTable] OFF
  • 重新标识身份
  • re-enable constraints
  • 删除copyOfYourtable

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

答案 5 :(得分:-1)

如果这是Microsoft的SQL Server,您可以做的一件事是使用 [dbcc checkident](http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx)

假设您有一个表要移动数据,同时重新编号主键。例如,表的名称是 ErrorCode 。它有两个字段, ErrorCodeID (这是主键)和描述

使用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。

希望这有点帮助!