1

我有一个快速的问题要问你 SQL 大师。我有没有主键列的现有表,并且未设置身份。现在我试图通过将现有整数列作为主键并为该列添加标识值来修改这些表。我的问题是在进行这些更改之前,我是否应该先将表中的所有记录复制到临时表中。如果我运行 T-SQL commnad 来创建主键并在这些表上添加标识列,我是否会丢失所有以前的记录。我应该采取哪些方法,例如

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

或者

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

谢谢

4

5 回答 5

4

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

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

[编辑]我已经用填充的表尝试过这个并且我没有丢失数据,但我对此知之甚少。

于 2009-05-11T15:55:29.683 回答
3

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

于 2009-05-11T17:13:43.207 回答
2

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

于 2009-05-11T15:55:07.187 回答
0

如果您现有的整数列是唯一且合适的,则将其转换为 PK 应该没有问题。

另一种选择,如果您不想使用现有列,您可以向主表添加一个新的 PK 列,填充它并为其播种,然后运行更新语句以使用新的 PK 更新所有其他表。

不管你怎么做,一定要先做好备份!!

于 2009-05-11T15:52:40.590 回答
0

完成数据复制后,您始终可以添加 IDENTITY 列。然后,您还可以将 IDENTITY 种子重置为最大整数 + 1。这应该可以解决您的问题。

DBCC CHECKIDENT ('MyTable', RESEED, n)

其中 n 是您希望身份开始的数字。

于 2009-05-11T15:55:49.650 回答