У меня есть следующие запросы, которые я выполняю для создания таблиц в 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.

Я не уверен, верны ли мои запросы, и не могу устранить эту ошибку.

1
Imraan 9 Май 2016 в 11:41

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!
)
4
Mureinik 9 Май 2016 в 08:49

Внешний ключ должен ссылаться на 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)
1
HoneyBadger 9 Май 2016 в 08:48