Sql 更改主键值

Sql 更改主键值,sql,sql-server,sql-server-2008,primary-key,Sql,Sql Server,Sql Server 2008,Primary Key,我有10张桌子。每个表由其他5个表的外键引用 我需要更改这10个表的主键值。有没有办法更改它,使其自动更改所有外键 我使用的是sql server 2008,有管理工作室。我自己从来没有这样做过,听起来这可能是个坏主意。也就是说,我确实找到了这篇文章,其中介绍了两种方法: 一个使用存储的进程和其他触发器。这两种方法看起来都有点麻烦。下面是一个使用ON UPDATE CASCADE外键选项的示例。您感兴趣的部分是两个ALTER TABLE语句 如果您将标识列用于主键,那么这将变得更加困难,因为您无

我有10张桌子。每个表由其他5个表的外键引用

我需要更改这10个表的主键值。有没有办法更改它,使其自动更改所有外键


我使用的是sql server 2008,有管理工作室。

我自己从来没有这样做过,听起来这可能是个坏主意。也就是说,我确实找到了这篇文章,其中介绍了两种方法:


一个使用存储的进程和其他触发器。这两种方法看起来都有点麻烦。

下面是一个使用ON UPDATE CASCADE外键选项的示例。您感兴趣的部分是两个ALTER TABLE语句

如果您将标识列用于主键,那么这将变得更加困难,因为您无法更新标识列


您需要为这些外键设置更新级联:

ALTER TABLE bar
ADD CONSTRAINT FK_foo_bar
FOREIGN KEY (fooid) REFERENCES foo(id)
ON UPDATE CASCADE
然后您只需更新FKs,引用字段也将作为事务的一部分进行更新:

UPDATE foo SET id = id + 1000

请注意,要更改约束,需要删除它们。

标识列的一个显著缺点是无法直接更新

解决方法不是在目标表中使用标识,而是将其放在一个额外的表中。首先使用标识列插入到表中,然后将生成的标识值插入到目标表中


SQL Server 2012引入了与表无关的序列,这是解决同一问题的更好方法。序列不需要额外的表。

我知道这并不是你问题的答案,但我来这里是想知道如何简单地设置write、insert、update或其他PK主键列

因此,您必须禁用PK约束,插入值,然后再启用它,更新将不起作用

SET IDENTITY_INSERT IdentityTable ON
INSERT IdentityTable(TheIdentity, TheValue) VALUES (3, 'First Row')
SET IDENTITY_INSERT IdentityTable OFF

只是出于好奇,你为什么要这样做?@Abe Miessler:我必须改变数据库的结构。我想为这10个表创建一个超类型。我不想找一个只需点击按钮就能正常运行的代码。这只是为了修复我的db方案而进行的一次更改。一旦完成,可能值得将约束更新回不支持级联更新的状态。@Chris Diver:我知道!我有标识列,所以我对每个表所做的是:1。创建新的_id列。2.将新id设置为新id。3。删除约束。4.使用新的_id.5更新了参考文献。删除主键。6.删除旧id列。7.使用新的_id.8创建新的主键。将新的_id重命名为id.9。再次创建约束。我希望避免这一切。我正在寻找一个命令,允许自动更新主键及其引用,因为我有10个表要用。你应该在问题中更清楚地说明你的要求。在这种情况下,我用“您不能更新标识列”回答了您的问题。因此,你不能“自动”完成它。但您可以重复使用创建新列时使用的相同T-SQL等。。。并将表名和列名指定为变量。UPDATE CASCADE是否会自动更改保存引用的表中的FK字段?
SET IDENTITY_INSERT IdentityTable ON
INSERT IdentityTable(TheIdentity, TheValue) VALUES (3, 'First Row')
SET IDENTITY_INSERT IdentityTable OFF