2012-03-29 54 views
5

我知道如何更新SQL中的多个表的问题已经被问到过,并且常见的答案似乎是在事务中单独进行。如何更新2个表中具有外键的2列

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

例如

Table1.a是一个外键Table2.a

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

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

我知道我可以临时删除密钥并更换,但肯定还有另一种方法。

谢谢

回答

10

您不能同时执行更新,但是您可以强制SQL执行更新。您需要确保您的外键具有参考触发动作ON UPDATE CASCADE

例如,

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

谢谢,这清除了事实,我不能。 Cascade工作得很好。 – Sunrise 2012-03-29 09:09:38

+0

+1也是我的! – 2012-03-29 12:19:29

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选项,则在引用表中更新 行,如果在父表中更新了相应的 引用行。如果NO ACTION指定为 ,则SQL Server Compact Edition将返回一个错误,并且回滚父表中引用行的更新 操作。

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

如果一个UPDATE语句对表B中的行和ON UPDATE CASCADE操作执行时用于A.ItemID指定的SQL Server Compact表A的一个或多个相关行 版检查是否有任何 存在,表A从属行被更新,如在表B中引用

可替换地,如果没有指定动作是行 ,SQL Server精简版 返回一个错误并回退引用 更新动作当表A中至少有一行 引用它时,在表B中成行。

+0

谢谢,级联更新效果很好。 – Sunrise 2012-03-29 09:10:30

2

并非是对级联更新,我会建议不同的路线风扇。

首先,你不更新父表,你添加一个新的纪录,你想要的值(与相同的数据作为所有其他领域的其他记录)。然后,您无需更新子表即可使用此值而不是该值。另外你现在必须做批量的工作,以避免锁定系统启动而改变颁布通过它的能力。一旦所有的子表已经更新,你可以删除原来的坏记录。

+0

感谢您的回答,除了我需要保持相同的标识字段和有唯一索引上的其它4列,以及这将限制需要你的方法他们重复这听起来不错。 – Sunrise 2012-03-29 14:22:08