2009-05-11 53 views
1

我对你的SQL高手有个疑问。我有现有的表没有主键列和身份没有设置。现在我试图通过将现有整数列作为主键并添加该列的标识值来修改这些表。我的问题是,我应该首先将表中的所有记录复制到临时表中,然后再进行这些更改。如果我运行T-SQL commnad来创建主键并在这些表上添加标识列,是否会丢失所有以前的记录?什么办法,我应该采取诸如加载数据后创建主键和标识列

1)创建临时表中的所有记录从表复制到被修改 2)负载的所有记录的不是Temptable 3)使上表架构更改 4 )最后,将临时表中的记录加载到原始表中。

或者

有更好的方法,这个?我真的很感谢你的帮助

感谢

回答

3

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

+0

谢谢我真的很喜欢你的答案。 – Shiva 2009-05-12 16:36:20

0

如果您现有的整数列是唯一和合适的,应该没有问题,将其转换为PK。另一种方法是,如果你不想使用现有的列,你可以在主表中添加一个新的PK列,填充它并对其进行种子化,然后运行更新语句以使用新的PK更新所有其他表。

无论你做什么,确保你先做一个备份!

2

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

+0

另一个aditional提示,有助于创建一个脚本运行它在nigth ..谢谢 – 2013-04-09 04:26:34

4

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

取消选中“禁止保存需要表重新创建的变化”

[编辑]我用填充表格尝试这样做,我没有会丢失数据,但我对此不甚了解。

+0

感谢您的提示...它节省了我的时间doind查询:) – 2013-04-09 04:24:02

0

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

DBCC CHECKIDENT( 'MyTable的',RESEED,N)

其中n是你想要的身份在开始数。