列组合的外键

时间:2019-12-24 14:02:36

标签: mysql foreign-keys

我有下表:

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表中的relationsb引用表a中的一行。现在,我要实现以下内容:
b中的每一行都必须在relations中具有一行,该行由id中的两个b组成。 id1中的b可以是id1中的id2relations,而id2中的b可以是{{1} }或id2中的id1。如果从relations表中删除了两个id之间的关系,我想删除relations表中具有这两个id的任何行。可以使用外键实现此目的吗?

1 个答案:

答案 0 :(得分:2)

顺序在外键约束中很重要,所以不,您不能在外键约束中实现。

但是您可以裁定relations中必须有一个订单,例如id1 < id2或(id1 <= id2),以及b中。在较新的MySQL版本(MySQL 8.0.16及更高版本)中,您可以使用检查约束。在较早的版本中,您将需要触发器。那么元组是可比较的,您可以使用外键约束。

确保引用表中的元组上有唯一索引。

另外,请注意:CREATE的{​​{1}}语句中外键的语法错误。您需要为每个列relationsid1设置一个约束。您不能一劳永逸。 (但是那个错误可能只发生在这里,而不是在实际代码中。)