当列具有非空值时,所有相关的外键约束都会被检查和验证。如果检查失败,则无法插入或更新该行。
如果您有两个 FK,并且您只想强制执行其中一个,那么您需要:
- 创建两个单独的可空列,每个 FK 一个,以及
- 添加一个
CHECK约束以强制执行一个且只有一个不为空。
例如:
create table "In" (
id int primary key not null,
ssn int, -- nullable
ssn_dod int, -- nullable
constraint fk1 foreign key (ssn) references patient (ssn),
constraint fk2 foreign key (ssn_dod) references patientwithdod (ssn),
constraint chk1 check (ssn is null and ssn_dod is not null or
ssn is not null and ssn_dod is null)
);
不幸的是,MySQL 最近才开始强制执行CHECK约束(如果我没记错的话,MySQL 8.0.3)。如果您使用的是旧版本的 MySQL,那么您就不走运了:MySQL 将允许您编写约束并保存它,但不会强制执行它。