0

我有 2 张桌子:

id box_name hidden

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

id item_name box_id hidden

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

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

4

2 回答 2

1

您可以通过在父表id,hidden字段上添加唯一约束并更改详细表以使其具有 FK 到 ( id,hidden) 而不仅仅是id. 但是,在这种情况下,我不明白为什么需要将hidden属性存储在详细表中,因为它始终与 parent 相同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) ;

每次您hidden在 boxTable 中更改时,它都会自动更新为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;

第二种方法允许您更改hiddenchildTable 中的字段,而不管 中的值如何boxTable,第一种方法不会。

于 2012-12-05T17:23:32.233 回答
1

我怀疑您误解了外键的用途。它们基本上旨在强制引用完整性,因此您不能物理存储目标行不存在的外键。而且它们还有助于保持这种完整性,因此当您尝试删除在另一个表中引用的行时,您要么不被允许,要么被级联删除。

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

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

于 2012-12-05T17:56:38.210 回答