我有两张桌子:
id box_name hidden
---------------------------
id item_name box_id hidden
所以外键是box_id,如果该框被删除或更新,它也会触及子项,但是如何使用隐藏字段进行相同的操作,它们是int(11)相同类型的索引,如果我隐藏一些框,所有的孩子都隐藏了,但是如何只隐藏引用box_id的孩子 - > id,那些隐藏的???
或换句话说,如何制作2个外键
答案 0 :(得分:1)
您可以通过在父表id,hidden
字段上添加唯一约束并更改详细信息表来轻松完成此操作,使其FK为(id,hidden
)而不是id
。但是,在这种情况下,我不明白为什么需要在详细信息表中存储hidden
属性,因为它始终与父hidden
相同。
我宁愿在主表上添加一个更新后触发器来更新详细信息表[s]中的所有必要行。
<强>更新即可。例子。
第一种方法
CREATE TABLE boxTable(id int not null auto_increment primary key,hidden
tinyint not null,
...
CONSTRAINT UQ_BOXTABLE(id,hidden));
CREATE TABLE childTable(...., boxId int not null, hidden tinyint not null,
CONSTRAINT FK_childTable_BoxTable FOREIGN KEY (boxId, hidden) REFERENCES
boxTable(boxId, hidden) ON DELETE CASCADE ON UPDATE CASCADE) ;
每次在boxTable中更改hidden
时,它都会在childTable
中自动更新。
第二种方法(双重检查语法,我目前没有mysql)
CREATE TRIGGER AU_boxTable AFTER UPDATE ON boxTable
FOR EACH ROW
BEGIN
IF (new.hidden <> old.hidden) THEN
update childTable set hidden = new.hidden WHERE boxId = new.id;
END IF;
END;
第二种方法允许您更改childTable中的hidden
字段,而不管boxTable
中的值是什么,第一种方法没有。
答案 1 :(得分:1)
我怀疑你误解了外键的用途。它们基本上旨在强制实施参照完整性,因此您无法物理存储其目标行不存在的外键。并且它们还有助于维护这种完整性,因此当您尝试删除另一个表中引用的行时,您将被禁止或者您获得级联删除。
但是没有办法使用外键来执行任意级联更新。它们根本就不是为它设计的。
也许您正在考虑触发器: - ?