我有下表:
CREATE TABLE IF NOT EXISTS `a` (
`id` INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY ( `id` )
);
CREATE TABLE IF NOT EXISTS `relations` (
`id1` INT NOT NULL,
`id2` INT NOT NULL,
PRIMARY KEY ( `id1`, `id2` ),
FOREIGN KEY ( `id1`, `id2` ) REFERENCES `a` ( `id` ) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS `b` (
`id1` INT NOT NULL,
`id2` INT NULL,
...
PRIMARY KEY ( `id1`, ... )
);
id1
表中和id2
表中的relations
和b
引用表a
中的一行。现在,我要实现以下内容:
b
中的每一行都必须在relations
中具有一行,该行由id
中的两个b
组成。 id1
中的b
可以是id1
中的id2
或relations
,而id2
中的b
可以是{{1} }或id2
中的id1
。如果从relations
表中删除了两个id
之间的关系,我想删除relations
表中具有这两个id
的任何行。可以使用外键实现此目的吗?
答案 0 :(得分:2)
顺序在外键约束中很重要,所以不,您不能在外键约束中实现。
但是您可以裁定relations
中必须有一个订单,例如id1 < id2
或(id1 <= id2
),以及b
中。在较新的MySQL版本(MySQL 8.0.16及更高版本)中,您可以使用检查约束。在较早的版本中,您将需要触发器。那么元组是可比较的,您可以使用外键约束。
确保引用表中的元组上有唯一索引。
另外,请注意:CREATE
的{{1}}语句中外键的语法错误。您需要为每个列relations
和id1
设置一个约束。您不能一劳永逸。 (但是那个错误可能只发生在这里,而不是在实际代码中。)