Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有一种方法可以在不删除外键的情况下更新主键标识规范增量1?_Sql Server - Fatal编程技术网

Sql server 有没有一种方法可以在不删除外键的情况下更新主键标识规范增量1?

Sql server 有没有一种方法可以在不删除外键的情况下更新主键标识规范增量1?,sql-server,Sql Server,我正在尝试将主键Id更改为identity,并在每个条目上递增1。但该列已被其他表引用。有没有办法将主键设置为自动递增,而不从其他表中删除外键 如果表不是那么大,则生成脚本以创建相同的表,但将其创建的架构更改为: CREATE TABLE MYTABLE_NEW ( PK INT PRIMARY KEY IDENTITY(1,1), COL1 TYPEx, COL2 TYPEx, COLn ...) 将数据库设置为单用户模式,或确保没有人在数据库中 正在更改的数据库或表或需要更改的表 更改为只

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

如果表不是那么大,则生成脚本以创建相同的表,但将其创建的架构更改为:

CREATE TABLE MYTABLE_NEW (
PK INT PRIMARY KEY IDENTITY(1,1),
COL1 TYPEx,
COL2 TYPEx,
COLn
...)
  • 将数据库设置为单用户模式,或确保没有人在数据库中 正在更改的数据库或表或需要更改的表 更改为只读/只读
  • 使用set IDENTITY_INSERT on将数据从MYTABLE导入MYTABLE_NEW
  • 编写外键约束脚本并保存它们,以备需要 稍后退出更改和/或重新实施更改
  • 从MYTABLE中删除所有约束
  • 将MYTABLE重命名为MYTABLE_SAV
  • 将MYTABLE_重命名为MYTABLE
  • 运行约束脚本在MYTABLE上重新实现约束
  • p、 美国。 您确实问过是否有办法不删除外键约束。这里有一些东西可以在你的测试系统上试用。在步骤4中运行 ALTER TABLE MYTABLE NOCHECK约束ALL 在步骤7中,更改表MYTABLE检查约束ALL。我自己也没试过——很有趣,我想看看这是否能在重命名的表上起作用

    您可以提前在测试SQL Server上编写所有这些脚本,甚至在生产服务器上准备数据库的副本,以便在实施当天不费吹灰之力,并为公司的任何变更控制过程评估SLA


    您可以通过删除主键并重新添加它来执行类似的方法,但在删除旧列之前,需要在新列中插入相同的数据。因此,您将使用这种方法删除和插入模式并插入主键数据。如果可能的话,我喜欢避免触摸生产表,让MYTABLE_SAV在身边以防“任何”意外发生对我个人来说是一种安慰——我可以告诉管理层“生产数据没有被触摸”。但是有些表太大,这种方法不值得,而且不同的DBA的品味和方法也有很大差异。

    您不能更改identity属性,只能为新列设置它。创建一个新的标识列,使用上的
    set identity\u insert[table]复制值,删除并重新创建外键约束。或者,从SQL Server 2012开始,您可以使用序列提供默认值,而无需删除该列。看见请注意,在该解决方案中,可以修改该值,这取决于您的场景。如果您使用的是sql server 2012或更高版本,我建议您创建一个序列,并为引用该序列的id列添加一个默认值。它的行为类似于identity,但不需要重新创建列。