有没有办法更新主键身份规范增量1而不删除外键?

时间:2015-02-26 10:55:30

标签: sql-server

我正在尝试将主键ID更改为标识,以便在每个条目上递增1。但该列已被其他表引用。有没有办法将主键设置为自动增量而不从其他表中删除外键?

1 个答案:

答案 0 :(得分:0)

如果表不是那么大的生成脚本来创建相同的表但是将其创建的模式更改为:

CREATE TABLE MYTABLE_NEW (
PK INT PRIMARY KEY IDENTITY(1,1),
COL1 TYPEx,
COL2 TYPEx,
COLn
...)
  1. 将您的数据库设置为单用户模式或确保没有人在 您正在更改或更改所需表的数据库或表 改为READ / ONLY。
  2. 使用IDENTITY_INSERT
  3. 从MYTABLE将数据导入MYTABLE_NEW
  4. 编写外键约束并保存它们 - 以备不时之需 稍后退出更改并/或重新实施它们。
  5. 从MYTABLE中删除所有限制
  6. 将MYTABLE重命名为MYTABLE_SAV
  7. 将MYTABLE_NEW重命名为MYTABLE
  8. 运行约束脚本以重新实现对MYTABLE的约束
  9. P.S。 你确实问过是否有办法不放弃外键约束。这是您的测试系统的一些尝试。在第4步运行 ALTER TABLE MYTABLE NOCHECK CONSTRAINT ALL 并在步骤7 ALTER TABLE MYTABLE CHECK CONSTRAINT ALL。我自己没有试过这个 - 有趣的是看这是否真的可以用于重命名的表。

    您可以在测试SQL Server上提前编写所有这些脚本,或者甚至是在生产服务器上暂存的数据库副本 - 使实施日变得简单,并为您公司的任何变更控制程序评估SLA

    您可以通过删除主键并重新添加它来执行类似的方法,但在删除旧列之前,您需要在新列中插入相同的数据。因此,您将使用此方法删除和插入架构并插入主键数据。如果可能的话,我希望避免触摸生产表,并且如果出现“任何”意外情况,我可以安排MYTABLE_SAV对我个人来说是一种安慰 - 因为我可以告诉管理层“没有触及生产数据”。但是有些表格太大而不适合这种方法,而且口味和方法也很大程度上与DBA到DBA不同。