Первичный ключ с двумя ссылками - PullRequest
0 голосов
/ 16 мая 2019

Мне бы хотелось, чтобы моя таблица отношений "In" имела внешний SSN-ключ, который ссылается на две таблицы, но этот SSN есть только в одной из этих двух таблиц. Когда я делаю это:

ALTER TABLE "In"
ADD CONSTRAINT in_C1 FOREIGN KEY (SSN) REFERENCES patient(SSN),
ADD CONSTRAINT in_C2 FOREIGN KEY (SSN) REFERENCES patientWithDoD(SSN)

Тогда SSN должен быть в таблице пациента и пациента с DoD. SSN должен быть в одной из двух таблиц, но не в обеих. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Когда столбец имеет ненулевое значение, все связанные ограничения внешнего ключа проверяются и проверяются.Если проверка не пройдена, строка не может быть вставлена ​​или обновлена.

Если у вас есть два 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 позволит вам написать ограничение и сохранить его, но не будет применять его.

0 голосов
/ 16 мая 2019

Я понимаю, что у вас нет атрибута SSN в таблице PatientWithDoD.Для ссылки на внешний ключ необходимо добавить этот атрибут в эту таблицу.

Рекомендуется добавлять только необходимые атрибуты в таблицу пациентов.Например: ssn, имя, фамилия и т. Д.

Тогда не добавляйте имя, фамилию и другие атрибуты пациента в таблицу PatientWithDod.Вы можете использовать только ssn для ссылки на оставшиеся данные пациента.Поэтому добавьте внешний ключ, который ssn ссылается на Patient.ssn

Эта структура была бы лучше, и вам не нужно ссылаться на таблицу PatienWithDod.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...