我知道如何更新SQL中的多个表的问题已经被问到过,并且常见的答案似乎是在事务中单独进行。如何更新2个表中具有外键的2列
但是,我需要更新的2列有一个外键,因此无法单独更新。
例如
Table1.a是一个外键Table2.a
表中的一个条目是错误的,例如两列都是'xxx',应该是'yyy'
如何将Table1.a和Table2.a更新为'yyy'?
我知道我可以临时删除密钥并更换,但肯定还有另一种方法。
谢谢
我知道如何更新SQL中的多个表的问题已经被问到过,并且常见的答案似乎是在事务中单独进行。如何更新2个表中具有外键的2列
但是,我需要更新的2列有一个外键,因此无法单独更新。
例如
Table1.a是一个外键Table2.a
表中的一个条目是错误的,例如两列都是'xxx',应该是'yyy'
如何将Table1.a和Table2.a更新为'yyy'?
我知道我可以临时删除密钥并更换,但肯定还有另一种方法。
谢谢
您不能同时执行更新,但是您可以强制SQL执行更新。您需要确保您的外键具有参考触发动作ON UPDATE CASCADE
例如,
ALTER TABLE YourTable
ADD CONSTRAINT FK_YourForeignKey
FOREIGN KEY (YourForeignKeyColumn)
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE
我的答案是基于以下链接: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中成行。
谢谢,级联更新效果很好。 – Sunrise 2012-03-29 09:10:30
并非是对级联更新,我会建议不同的路线风扇。
首先,你不更新父表,你添加一个新的纪录,你想要的值(与相同的数据作为所有其他领域的其他记录)。然后,您无需更新子表即可使用此值而不是该值。另外你现在必须做批量的工作,以避免锁定系统启动而改变颁布通过它的能力。一旦所有的子表已经更新,你可以删除原来的坏记录。
感谢您的回答,除了我需要保持相同的标识字段和有唯一索引上的其它4列,以及这将限制需要你的方法他们重复这听起来不错。 – Sunrise 2012-03-29 14:22:08
谢谢,这清除了事实,我不能。 Cascade工作得很好。 – Sunrise 2012-03-29 09:09:38
+1也是我的! – 2012-03-29 12:19:29