我正在尝试创建一个包含两个字段(id1,id2(的表,其中它们都引用id作为其他表中的外键,并且两种方式都是唯一的。
快速示例:
具有字段 ID 和名称的表"人员"。具有字段 id1 和 id2 的表"婚姻"。现在,如果我知道id=3的人与id=6结婚,那么就没有必要在"婚姻"表中有(id1=3,id2=6(和(id1=6,id2=3(。
在大多数数据库中,可以使用check
约束来执行此操作。 像这样:
alter table t add constraint chk_t_id1_id2 check (id1 < id2)
或者,使用表达式或计算列的唯一索引:
create unique index unq_t_id1_id2 on (least(id1, id2), greatest(id1, id2));
最新版本的MySQL支持生成的列,因此您可以对生成的列执行类似于上述操作的操作。
否则,需要使用触发器。 这绝对是可行的,但是您需要在插入和更新时考虑逻辑。 触发器更多的是工作而不是约束。
您可以使用外键约束.. 这是使用查询的方法
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;