我有 2 张桌子:
id box_name hidden
---------------------------
id item_name box_id hidden
所以外键是box_id,如果盒子被删除或更新,它也会触及子项目,但我怎样才能使隐藏字段相同,它们是具有相同类型int(11)的索引,如果我隐藏一些盒子,所有的孩子都被隐藏了,但是如何只隐藏那些引用box_id -> id的孩子,那些隐藏的???
或者换句话说,如何制作 2 个外键
我有 2 张桌子:
id box_name hidden
---------------------------
id item_name box_id hidden
所以外键是box_id,如果盒子被删除或更新,它也会触及子项目,但我怎样才能使隐藏字段相同,它们是具有相同类型int(11)的索引,如果我隐藏一些盒子,所有的孩子都被隐藏了,但是如何只隐藏那些引用box_id -> id的孩子,那些隐藏的???
或者换句话说,如何制作 2 个外键
您可以通过在父表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;
第二种方法允许您更改hidden
childTable 中的字段,而不管 中的值如何boxTable
,第一种方法不会。
我怀疑您误解了外键的用途。它们基本上旨在强制引用完整性,因此您不能物理存储目标行不存在的外键。而且它们还有助于保持这种完整性,因此当您尝试删除在另一个表中引用的行时,您要么不被允许,要么被级联删除。
但是没有办法使用外键来执行任意级联更新。它们根本不是为此而设计的。
也许您正在考虑触发器:-?