Viele-zu-Viele-Tabellen SQL - mysql, sql

Ich muss viele zu viele Tische zwischen einem Tisch MEAL und einem Tisch RESTAURANT machen. Zuerst habe ich die zwei Tabellen erstellt:

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));

Dann habe ich die "gemeinsamen" Tabellen erstellt:

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));

Ich habe einige Daten in den ersten beiden Tabellen eingegeben:

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);

Bis jetzt, jetzt gibt es kein Problem, aber als ich versuchte, Daten in den dritten Tabellen einzugeben mit:

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);

zum Beispiel, dann habe ich eine Fehlermeldung:

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

Ich verstehe nicht, warum ich diese Nachricht habe und wie ich sie korrigieren kann. Danke im Voraus.

Antworten:

1 für die Antwort № 1

Wie Shadow im Kommentarabschnitt sagte.

Korrigieren Sie zunächst Ihren Tippfehler in einer Ihrer SQL-Anweisungen:

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);

sollte sein:

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);

Zweite: Tun Sie sich einen Gefallen und verwenden Sie Integer für Primärschlüssel und mit der Option auto_increment können Sie die ID einfach ignorieren.

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`));

Daten:

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);

Dritte: INT (3) hat keine Auswirkungen. Der Platz für den INT wird trotzdem vergeben. Sie können vielleicht TINYINT oder SMALLINT instad verwenden. Schau hier: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

Vierte: Benutze Kamel-Fall oder Schlangen-Fall aber bitte nicht beide ;-)