mysql中的两个外键(INNODB)

时间:2012-12-05 17:12:31

标签: mysql

我有两张桌子:

id box_name hidden

---------------------------

id item_name box_id hidden

所以外键是box_id,如果该框被删除或更新,它也会触及子项,但是如何使用隐藏字段进行相同的操作,它们是int(11)相同类型的索引,如果我隐藏一些框,所有的孩子都隐藏了,但是如何只隐藏引用box_id的孩子 - > id,那些隐藏的???

或换句话说,如何制作2个外键

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)

我怀疑你误解了外键的用途。它们基本上旨在强制实施参照完整性,因此您无法物理存储其目标行不存在的外键。并且它们还有助于维护这种完整性,因此当您尝试删除另一个表中引用的行时,您将被禁止或者您获得级联删除。

但是没有办法使用外键来执行任意级联更新。它们根本就不是为它设计的。

也许您正在考虑触发器: - ?