我有这个:
Foo
Id|BarId
Bar
Id
TableX
Id|FooId|BarId
TableY
Id|FooId|BarId
我需要它用于这样的情况:如果像这样的查询
update Foo
set BarId = some bar id
where BarId = some other bar id
然后它级联到TableX
和TableY
。是否可以将FK与on update cascade一起使用,或者仅使用手动定义的触发器?
发布于 2011-07-01 03:28:38
首先,删除TableX
和TableY
中的所有外键约束。
然后:
ALTER TABLE TableX
ADD CONSTRAINT FK_TableX_FooId_BarID FOREIGN KEY (FooId, BarId)
REFERENCES Foo (Id, BarId) ON UPDATE CASCADE;
-- Do the same for TableY
您没有说您使用的是什么数据库管理系统(请这样做),但这肯定会在SQL Server中运行,可能还会在MySql中运行。在此外键引用生效之前,必须对表Foo
中的(Id, BarId)
具有索引或唯一约束(隐式创建索引)。
您不希望对每一列使用单独的外键,因为这将打破BarId
与FooId
之间的分层多层关系。如果您更新Foo中的特定BarId
,您希望它只更新TableX中与该特定FooId
链接的那些BarId
,而不是整个表中的所有FooId
。(也就是说,如果我理解正确的话)。
我也情不自禁地提出,应该删除名为Id
的列,然后朝它的头部开枪。不久之后,他们的创造者至少受到了一次坚实的鞭打。:)改为将Foo
表的主键命名为FooId
。随着数据库的增长和涉及越来越多表的查询变得越来越复杂,不断给列添加别名(F.Id FooId
)不仅令人讨厌,而且越来越有可能会出错,比如说,不小心将T.Id
放在您想要的位置P.Id
,查询将不会给您任何错误,因为这两个表中都有该列。
在我的理解中,数据库专业人员的普遍共识是,无论在哪里使用列,都应该使用相同的名称,包括在它们的源表中。
另外,如果没有在其他地方引用TableX和TableY,那么这些列中的人工Id
列可能会倾向于另一个具有业务意义的列。我对表的了解不多,但很多时候,在不需要它们的时候会生成额外的人工in (例如在多对多中间连接表中,它们几乎永远不应该有单独的in)。
发布于 2011-06-29 04:09:28
如果指定On Update Cascade,则将更新引用的值。尝试使用该创建脚本
CREATE TABLE TableX(
id INT,
FooId INT,
BarId INT,
INDEX foo_idx (FooId),
INDEX bar_idx (BarId),
FOREIGN KEY (FooId)
REFERENCES Foo(Id)
ON UPDATE CASCADE
FOREIGN KEY (BarId)
REFERENCES Bar(Id)
ON UPDATE CASCADE
) ENGINE=INNODB;
https://stackoverflow.com/questions/6511668
复制相似问题