Багато-багато таблиць SQL - mysql, sql

Мені доводиться робити багато для багатьох столів між столом ЛЮДЕЯ та стіл РЕСТОРАН. Спочатку я створив дві таблиці:

CREATE TABLE RESTAURANT (
ID_Restaurant VARCHAR(10) NOT NULL,
ID_Hotel VARCHAR(10) NOT NULL,
Name VARCHAR(30) NOT NULL,
Number_of_Tables INT(3) NOT NULL,
PRIMARY KEY (ID_Restaurant),
FOREIGN KEY (ID_Hotel) REFERENCES HOTEL (ID_Hotel));

CREATE TABLE MEAL(
ID_Meal VARCHAR(10) NOT NULL,
Name VARCHAR(30) NOT NULL,
Preparation_Time VARCHAR(20),
Cooking_Time VARCHAR(20),
PRIMARY KEY (ID_Meal));

Тоді я створив "спільні" таблиці:

CREATE TABLE MEAL_SERVED(
ID_Meal VARCHAR(10) NOT NULL,
ID_Restaurant VARCHAR(10) NOT NULL,
Price INT(5) NOT NULL,
PRIMARY KEY (ID_Meal, ID_Restaurant, Price),
FOREIGN KEY(ID_Meal) REFERENCES MEAL(ID_Meal),
FOREIGN KEY(ID_Restaurant) REFERENCES RESTAURANT (ID_Restaurant));

Я ввів деякі дані в перші дві таблиці:

INSERT INTO RESTAURANT(ID_Restaurant, ID_Hotel, Name, Number_of_Tables)
VALUES ("REST1", "H1", "Benares Indisk Restaurant", 26);
("REST2", "H2", "La Gaichel", 35),
("REST3", "H3", "Tapas Restaurant", 17),
("REST4", "H4", "Faubourg 101", 19),
("REST5", "H5", "Pizzeria Roma", 38);

INSERT INTO MEAL(ID_Meal, Name, Preparation_Time, Cooking_Time)
VALUES ("MEAL1", "Croque-Monsieur", "5 min", "4 min"),
("MEAL2", "Salad", "6 min", NULL),
("MEAL3", "Hot Dog", "3 min", "2min"),
("MEAL4", "Panini", "6 min", "5 min"),
("MEAL5", "Coca-Cola", NULL, NULL);

Доки зараз немає ніяких проблем, але коли я намагався ввести дані в третьому столі з:

INSERT INTO MEAL_SERVED(ID_Meal, ID_Restaurant, Price)
VALUES ("MEAL1", "REST1", 50),
("MEAL4", "REST1", 50),
("MEAL5", "REST1", 35),
("MEAL1", "REST2", 3.5),
("MEAL2", "REST2", 3.5),
("MEAL4", "REST2", 5);

наприклад, у мене є повідомлення про помилку:

FOREIGN KEY constraint failed: INSERT INTO MEAL_SERVED(ID_Meal, ID_Restaurant, Price)

Я не розумію, чому я маю це повідомлення та як його виправити. Спасибо заранее.

Відповіді:

1 для відповіді № 1

Як сказала Тінь в розділі коментарів.

По-перше, виправте помилку в одному з ваших SQL-операторів:

INSERT INTO RESTAURANT(ID_Restaurant, ID_Hotel, Name, Number_of_Tables)
VALUES ("REST1", "H1", "Benares Indisk Restaurant", 26);
("REST2", "H2", "La Gaichel", 35),
("REST3", "H3", "Tapas Restaurant", 17),
("REST4", "H4", "Faubourg 101", 19),
("REST5", "H5", "Pizzeria Roma", 38);

має бути:

INSERT INTO RESTAURANT(ID_Restaurant, ID_Hotel, Name, Number_of_Tables)
VALUES ("REST1", "H1", "Benares Indisk Restaurant", 26),
("REST2", "H2", "La Gaichel", 35),
("REST3", "H3", "Tapas Restaurant", 17),
("REST4", "H4", "Faubourg 101", 19),
("REST5", "H5", "Pizzeria Roma", 38);

Другий: Зробіть собі користь і користуйтеся цілими числами для первинних ключів і за допомогою параметра auto_increment, ви можете просто ігнорувати ідентифікатор.

CREATE TABLE RESTAURANT (
`id` INT NOT NULL AUTO_INCREMENT,
`hotel` INT NOT NULL,
`name` VARCHAR(30) NOT NULL,
`numberOfTables` INT NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (hotel) REFERENCES HOTEL (`id`));

CREATE TABLE MEAL(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`preparationTime` VARCHAR(20),
`cookingTime` VARCHAR(20),
PRIMARY KEY (`id`));

CREATE TABLE MEAL_SERVED(
`id` INT NOT NULL AUTO_INCREMENT,
`meal` INT NOT NULL,
`restaurant` INT NOT NULL,
Price FLOAT NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY(meal) REFERENCES MEAL(`id`),
FOREIGN KEY(restaurant) REFERENCES RESTAURANT (`id`));

Дані:

INSERT INTO RESTAURANT(`hotel`, `name`, `numberOfTables`)
VALUES ("1", "Benares Indisk Restaurant", 26),
(2, "La Gaichel", 35),
(3, "Tapas Restaurant", 17),
(4, "Faubourg 101", 19),
(5, "Pizzeria Roma", 38);

INSERT INTO MEAL(`name`, `preparationTime`, `cookingTime`)
VALUES ("Croque-Monsieur", "5 min", "4 min"),
("Salad", "6 min", NULL),
("Hot Dog", "3 min", "2min"),
("Panini", "6 min", "5 min"),
("Coca-Cola", NULL, NULL);

INSERT INTO MEAL_SERVED(`meal`, `restaurant`, `price`)
VALUES (1, 1, 50),
(4, 1, 50),
(5, 1, 35),
(1, 2, 3.5),
(2, 2, 3.5),
(4, 2, 5);

Третя: INT (3) не має ефектів. Простір для INT буде виділено в будь-якому випадку. Можливо, ви можете використовувати TINYINT або SMALLINT instad. Послухайте: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

Четверте: Використовуйте верблюжку або змію-футляр, але не обидва ;-)


Схожі запитання
Найбільш популярний