2017-11-22 9 views
2

テーブルMEALとテーブルRESTAURANTの間に多対多のテーブルを作成する必要があります。その後、私は '共同' のテーブルを作成し多対多テーブル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)); 

:まず、私は2つのテーブルを作成し

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

私は最初の2つの表にいくつかのデータを入力:

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

までは、今問題はありませんが、3番目の表にデータを入力しようとしたとき:

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); 
例えば10

、その後、私はエラーメッセージを持っている:

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

私はこのメッセージを持っているし、どのようにそれを修正するために、なぜ私は理解していません。前もって感謝します。

+1

挿入一つ一つを実行します。どちらが失敗するかを確認してください。正確なキー値を持つ両方のテーブルに対してselectを実行し、それらが存在するかどうかを確認します。 –

+0

Varchar id's ...整数に何が問題なのですか? – jarlh

+0

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

は次のようになります。 が自分に好意を行い、プライマリキーの整数を使用し、AUTO_INCREMENTで:

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

セカンドオプションでは、idを無視することができます。

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

第四: 利用キャメルケースや蛇のケースではなく、両方してください;-)

関連する問題