Соединение нескольких таблиц MySQL с помощью внешних ключей - PullRequest
1 голос
/ 14 марта 2019

У меня есть 3 разные таблицы на MySQL:

  • Клиенты
  • Авиабилеты
  • Заказы

Вкл. Clients У меня

  • Имя
  • Фамилия
  • ID
  • Номер рейса (из таблицы рейсов)
  • Номер бронирования (из таблицы «Бронирование»)

Вкл Flights У меня

  • ID (от клиентов)
  • Номер рейса
  • Компания
  • Дата

Вкл. Bookings У меня

  • ID (от клиентов)
  • Номер бронирования
  • Hotel
  • Дата заезда
  • Дата выезда

Я хочу после создания Клиента сделать ссылку на то, что я создаю в таблицах «Авиабилеты» и «Заказы», ​​на Клиентов.

Итак, у каждого Клиента есть идентификатор, который также вставляется в таблицы «Авиабилеты и бронирование». И мне нужно связать эту строку Clients.ID с ее строкой на рейсах и бронировании.

Возможно ли это с иностранными ключами?

Я пытался сделать Clients.ID Первичным ключом, а Flights.ID и Booking.ID Внешним ключом, но затем, когда я использую INSERT INTO, я получаю:

# 1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется

SQL-запрос был:

INSERT INTO clients (name, lastname, id) VALUES ('Jane', 'DOE', 123123123);

SQL-запрос для создания внешних ключей был:

ALTER TABLE clients ADD CONSTRAINT fk_flightid FOREIGN KEY (id) REFERENCES flights(id);` and 

ALTER TABLE clients ADD CONSTRAINT fk_bookingid FOREIGN KEY (id) REFERENCES bookings(id);`

Это мой первый раз, когда я пишу MySQL, извините, если мое объяснение запутано.

1 Ответ

1 голос
/ 14 марта 2019

Вы создали ограничения, которые делают client дочерней таблицей flights и bookings. Как следствие, вы не можете создавать новых клиентов (сначала вам нужно будет создать родительские записи в двух других таблицах).

В вашей базе данных client должна быть родительской таблицей, с flights и bookings в качестве дочерних таблиц.

Рассмотрим:

ALTER TABLE flights 
    ADD CONSTRAINT fk_flights_client_id 
    FOREIGN KEY (id) REFERENCES client(id);

ALTER TABLE bookings 
    ADD CONSTRAINT fk_bookings_client_id 
    FOREIGN KEY (id) REFERENCES client(id);

Другие замечания:

  • столбцы Flight Number (from Flights table) и Booking Number (from Bookings table) не имеют смысла в таблице Client. Эта информация принадлежит дочерней таблице и доступна через JOIN s

  • Я бы рекомендовал переименовать столбцы от ID до ClientID во всех 3 таблицах; использование имени, которое имеет смысл, функционально лучше, чем общее имя.

...