代码之家  ›  专栏  ›  技术社区  ›  Aaron Fischer

对主键重新编号

  •  8
  • Aaron Fischer  · 技术社区  · 16 年前

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

    6 回复  |  直到 9 年前
        1
  •  14
  •   Galwegian    16 年前

    我将首先向表中添加另一列,用新的pk填充它。

    然后,我将使用UPDATE语句更新所有相关表中的新FK字段。

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

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

        2
  •  6
  •   Sk93    9 年前

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

    SET IDENTITY_INSERT [MyTable] ON
    

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

    SET IDENTITY_INSERT [MyTable] OFF
    

    希望有帮助!

        3
  •  2
  •   Codewerks    16 年前

    这可能与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
    
        4
  •  1
  •   Tony Andrews    16 年前

    你为什么还要麻烦?基于计数器的“身份”主键的关键是数字是任意的,没有意义。

        5
  •  1
  •   Community Navdeep Singh    7 年前

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

    • 用额外的列新建关键字创建表格的副本
    • 用表中受影响的行以及所需的新关键字值填充CopyOfYourtable。
    • temporarily disable constraints
    • 更新所有相关表以指向新的\键而不是旧的\键的值
    • 从表格中删除受影响的行
    • 设置标识插入
    • 使用键的新正确值(从复制表)再次插入受影响的行
    • 关闭标识插入
    • 再生产身份
    • re-enable constraints
    • 删除表格的副本

    但正如其他人所说,所有这些工作都是不需要的。 我倾向于将标识类型主键看作是C中指针的等价物,我使用它们引用其他对象,但从不显式修改访问它们。

        6
  •  -1
  •   Scott Saad    16 年前

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

    假设您有一个表,希望在其中移动数据,并对主键重新编号。例如,表的名称是 错误代码 . 它有两个字段, 错误代码 (这是主键)和 描述 .

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

    希望这有点帮助!