我知道之前曾经问过如何在SQL中更新多个表的问题,而且常见的答案似乎是在事务中单独进行。
但是,我需要更新的2列有一个外键,因此无法单独更新。
e.g。
Table1.a是Table2.a的外键
表中的一个条目是错误的,例如两列都是'xxx',应该是'yyy'
如何将Table1.a和Table2.a更新为'yyy'?
我知道我可以暂时移除钥匙并更换,但肯定还有另一种方式。
由于
答案 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表,添加具有所需值的新记录(以及与所有其他字段的其他记录相同的数据)。然后,您可以轻松更新子表以使用此值而不是该值。此外,您现在可以批量完成工作,以避免在更改通过它发布时锁定系统。更新所有子表后,您可以删除原始错误记录。