Составной первичный ключ как внешний ключ MySQL

0

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

TABLE PARTECIPATION
(PARTY_ID INT,
GUEST ...
PRIMARY KEY(PARTY_ID, GUEST)
FOREIGN KEY(PARTY_ID) REFERENCES PARTY(ID)
FOREIGN KEY(GUEST) REFERENCES GUEST(GUEST)
)

И таблица гостей

TABLE GUEST
(NAME VARCHAR(20),
SURNAME VARCHAR(20),
AGE INT,

PRIMARY KEY(NAME, SURNAME)
)

Теперь, как я могу установить GUEST-элемент PARTECIPATION как FOREIGN KEY REFERENCES в GUEST TABLE?

Должен ли я создать столбец в GUEST named, idk, ID и установить его как первичный ключ? Или я могу сделать что-то вроде этого:

TABLE PARTECIPATION
(PARTY_ID INT,
GUEST_NAME VARCHAR(20),
GUEST_SURNAME VARCHAR(20)
PRIMARY KEY(PARTY_ID, GUEST_NAME, GUEST_SURNAME)
FOREIGN KEY(PARTY_ID) REFERENCES PARTY(ID),
FOREIGN KEY(GUEST_NAME) REFERENCES GUEST(NAME),
FOREIGN KEY(GUEST_SURNAME) REFERENCES GUEST(SURNAME))
  • 0
    Да, вы можете ссылаться на несколько полей pks во внешнем ключе, но имена не делают хороший pk. Подумайте только: что будет, если два Джона Смита попытаются зарегистрироваться? Таким образом, в данном конкретном случае вы должны создать отдельное поле guest_id, сделать его уникальным идентификатором и ссылкой на внешний ключ.
Теги:
foreign-keys
primary-key
rdbms
composite-primary-key

1 ответ

0

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

TABLE PARTECIPATION
(PARTY_ID INT,
GUEST_NAME VARCHAR(20),
GUEST_SURNAME VARCHAR(20)
PRIMARY KEY(PARTY_ID, GUEST_NAME, GUEST_SURNAME)
FOREIGN KEY(PARTY_ID) REFERENCES PARTY(ID),
FOREIGN KEY(GUEST_NAME, GUEST_SURNAME) REFERENCES GUEST(NAME, SURNAME))
  • 0
    Спасибо! Итак, если внешний ключ ссылается на составной первичный ключ, я должен объявить его в одном определении внешнего ключа, верно? Как ты только что написал? Я знаю, что это худший пример, который я могу создать, но мне нужно понять концепцию
  • 0
    Да, как я только что написал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню