ограничения внешнего ключа для таблицы с составным первичным ключом - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть 2 таблицы:

Первый - что-то вроде этого:

Person
       first_name (primary key)
       family_name (primary key)
       age
       [other things..]

второй:

Doctor
       first_name
       family_name
       specialty

Таким образом, в сущности, в таблице Person их не может быть 2 человека с одинаковыми first_name и family_name. Это хорошо работает, если я оба установил их на primary key, используя phpmyadmin.

Моя проблема в том, что теперь я хочу сделать невозможным добавление Doctor, который не является Person. Я пытался установить ограничение внешнего ключа для doctor.first_name и doctor.family_name, но это, очевидно, не решило мою проблему.

(не просите меня использовать идентификатор или что-то в этом роде, мои таблицы намного сложнее, и я не могу использовать идентификатор, это должна быть таблица с составным первичным ключом).

1 Ответ

1 голос
/ 12 декабря 2011

Ваша формулировка не точная.Таблица не может иметь 2 основных ключа.Однако он может иметь состав (составной) Первичный ключ , который состоит из 2 или более столбцов.

CREATE TABLE Person
(      first_name 
,      family_name 
,      age
,      ...
,   PRIMARY KEY (first_name, family_name)
)

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

CREATE TABLE Doctor
(      first_name
,      family_name
,      specialty
,      ...
,   PRIMARY KEY (first_name, family_name)

,   FOREIGN KEY (first_name, family_name)
      REFERENCES Person (first_name, family_name)
)  

Этот тип ограничения внешнего ключа, где PRIMARY KEY таблицы (Doctor) также является FOREIGN KEY для другой таблицы (Person) является общим решением для отношения 1::0..1 (также называемого супертипом / подтипом).

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