Когда столбец имеет ненулевое значение, все связанные ограничения внешнего ключа проверяются и проверяются.Если проверка не пройдена, строка не может быть вставлена или обновлена.
Если у вас есть два FK, и вы хотите, чтобы только один из них был приведен в исполнение, вам необходимо:
- создать два отдельных столбца, допускающих значение NULL, по одному для каждого 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 позволит вам написать ограничение и сохранить его, но не будет применять его.