У меня есть следующие запросы, которые я выполняю для создания таблиц в MS SQL Server:
CREATE TABLE menus
(
menu_id int NOT NULL PRIMARY KEY,
menu_name char,
other_details char
)
CREATE TABLE bookings
(
booking_Id int NOT NULL PRIMARY KEY,
date_booked DATE,
date_of_booking DATE,
other_details char,
staff_id int FOREIGN KEY REFERENCES staff(staff_id),
customer_id int FOREIGN KEY REFERENCES customers(customer_id)
)
CREATE TABLE menus_booked
(
menu_id INT NOT NULL,
booking_id INT NOT NULL,
CONSTRAINT PK_menus_booked PRIMARY KEY(menu_id,booking_id),
FOREIGN KEY (menu_id) REFERENCES menus(menu_id),
FOREIGN KEY (booking_id) REFERENCES bookings(booking_id)
)
CREATE TABLE menu_changes
(
change_id int NOT NULL PRIMARY KEY,
menu_id int NOT NULL,
booking_id int NOT NULL,
change_details char,
FOREIGN KEY (menu_id) REFERENCES menus_booked(menu_id),
FOREIGN KEY (booking_id) REFERENCES menus_booked(booking_id)
)
При выполнении последнего запроса я получаю сообщение об ошибке:
В указанной таблице menus_booked нет первичных ключей или ключей-кандидатов, которые соответствуют списку ссылающихся столбцов во внешнем ключе FK_menu_chan_menu.
Я не уверен, верны ли мои запросы, и не могу устранить эту ошибку.
2 ответа
Первичный ключ menus_booked
представляет собой уникальную комбинацию menu_id
и booking_id
. Иностранный объект должен указывать на эту комбинацию, а не только на одно из ее полей, которое не обязательно уникально. В настоящее время ваш запрос пытается определить два внешних ключа, по одному в каждом столбце, вместо одного внешнего ключа в комбинации столбцов:
CREATE TABLE menu_changes
(
change_id int NOT NULL PRIMARY KEY,
menu_id int NOT NULL,
booking_id int NOT NULL,
change_details char,
FOREIGN KEY (menu_id, booking_id)
REFERENCES menus_booked(menu_id, booking_id) -- Here!
)
Внешний ключ должен ссылаться на primary key
(или unique key
, но здесь проблема в PK), и он должен ссылаться на него целиком.
FOREIGN KEY (menu_id) REFERENCES menus_booked(menu_id),
FOREIGN KEY (booking_id) REFERENCES menus_booked(booking_id)
У вас есть две ссылки на внешние ключи первичного ключа menus_booked. Вам нужно будет изменить его на:
FOREIGN KEY (menu_id, booking_id) REFERENCES menus_booked(menu_id, booking_id)
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.