代码之家  ›  专栏  ›  技术社区  ›  Shiva

加载数据后生成主键和标识列

  •  1
  • Shiva  · 技术社区  · 15 年前

    我有个很快的问题要问你,SQL专家。我有没有主键列的现有表,并且没有设置标识。现在,我试图通过将现有的整型列设为主键并为该列添加标识值来修改这些表。我的问题是,在进行这些更改之前,是否应该首先将表中的所有记录复制到临时表中。如果我运行T-SQL命令来生成主键并在这些表上添加标识列,是否释放所有以前的记录?我应该采取什么样的方法

    1)创建临时表,从要修改的表中复制所有记录 2)将所有记录加载到诱人的 3)更改表架构 4)最后将临时表中的记录加载到原始表中。

    有更好的方法吗?我真的很感谢你的帮助

    谢谢

    5 回复  |  直到 14 年前
        1
  •  3
  •   HLGEM    15 年前

    希望你没有太多的记录。如果使用ManagementStudio将现有字段更改为Identity,会发生的情况是,它使用Identity字段集创建另一个表。它打开标识插入并插入原始表中的记录,然后关闭标识插入。然后它删除旧表并重命名它刚创建的表。如果您有许多记录,这可能是一个相当长的过程。如果是这样的话,我会编写这个脚本,然后在一个非工作时间运行的作业中执行,因为在执行此操作时,表将完全锁定。

        2
  •  4
  •   Daniel Sam    15 年前

    工具>选项>设计器>表和数据库设计器

    取消选中“防止保存需要重新创建表的更改”

    [编辑]我在填充表中尝试过,没有丢失数据,但我对这一点了解不多。

        3
  •  2
  •   KM.    15 年前

    只需在ManagementStudio中执行所有更改,将生成的脚本复制/粘贴到文件中。此时不要保存更改。根据需要查看和编辑该脚本,它可能会完全按照您的想法执行(它将删除原始表并将临时表重命名为原始表的名称),但也会处理所有约束和FK。

        4
  •  0
  •   Galwegian    15 年前

    如果您现有的整数列是唯一的,并且合适,那么将它转换为pk应该没有问题。

    另一种选择是,如果不想使用现有列,可以向主表添加一个新的pk列,填充它并对其进行种子设定,然后运行update语句以使用新的pk更新所有其他表。

    不管你怎么做,确保你先做备份!!

        5
  •  0
  •   uriDium    15 年前

    在复制完数据后,始终可以添加标识列。然后您还可以将标识种子重置为最大整数+1。这样可以解决你的问题。

    DBCC CHECKIDENT('MyTable',重设,n)

    其中n是您希望标识从中开始的编号。