如何更新2个具有外键的表中的2列

时间:2012-03-29 08:46:11

标签: sql sql-server-2008 foreign-keys

我知道之前曾经问过如何在SQL中更新多个表的问题,而且常见的答案似乎是在事务中单独进行。

但是,我需要更新的2列有一个外键,因此无法单独更新。

e.g。

Table1.a是Table2.a的外键

表中的一个条目是错误的,例如两列都是'xxx',应该是'yyy'

如何将Table1.a和Table2.a更新为'yyy'?

我知道我可以暂时移除钥匙并更换,但肯定还有另一种方式。

由于

3 个答案:

答案 0 :(得分:10)

您无法同时执行更新,但可以强制SQL执行更新。您需要确保外键具有引用触发操作ON UPDATE CASCADE

e.g。

ALTER TABLE YourTable
ADD CONSTRAINT FK_YourForeignKey
FOREIGN KEY (YourForeignKeyColumn) 
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE

答案 1 :(得分:2)

我的回答基于以下链接:http://msdn.microsoft.com/en-us/library/ms174123%28v=SQL.90%29.aspx

您需要确保将table_constraint定义为ON UPDATE CASCADE

          CREATE TABLE works_on1
         (emp_no INTEGER NOT NULL,
          project_no CHAR(4) NOT NULL,
          job CHAR (15) NULL,
          enter_date DATETIME NULL,
          CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no),
          CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) REFERENCES employee(emp_no) ON DELETE CASCADE,
          CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) REFERENCES project(project_no) ON UPDATE CASCADE)

然后何时更改主键的值

请参阅以下引文:

  

对于ON DELETE或ON UPDATE,如果指定了CASCADE选项,则   如果对应,则在引用表中更新行   引用的行在父表中更新。如果没有行动   指定,SQL Server Compact Edition返回错误和更新   回滚父表中引用行的操作。

     

例如,您可能在数据库中有两个表A和B.表   A与表B具有参考关系:A.ItemID foreign   key引用B.ItemID主键。

     

如果在表B中的行和ON上执行UPDATE语句   为A.ItemID,SQL Server Compact指定了UPDATE CASCADE操作   Edition检查表A中的一个或多个相关行。如果有的话   存在时,表A中的依赖行更新,行也是如此   在表B中引用。

     

或者,如果指定了NO ACTION,则为SQL Server Compact Edition   返回错误并回滚引用的更新操作   当表A中至少有一行时,表B中的行   引用它。

答案 2 :(得分:2)

不是更新级联的粉丝,我会建议一个不同的路线。

首先,您不更新Parent表,添加具有所需值的新记录(以及与所有其他字段的其他记录相同的数据)。然后,您可以轻松更新子表以使用此值而不是该值。此外,您现在可以批量完成工作,以避免在更改通过它发布时锁定系统。更新所有子表后,您可以删除原始错误记录。