2013-07-03 15 views
10

MySQLデータベースに多対多の関係を作成しようとしています。私は3つのテーブル: Films,GenresおよびFilms_Genresを持っています。私はそれらを設定するには、次のコードを使用しています:FOREIGN KEYSとのMySQL多対多関係

CREATE TABLE Films 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Title VARCHAR(255) 
), 

CREATE TABLE Genres 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Name VARCHAR(255) 
), 

CREATE TABLE Films_Genres 
(
    film_id INT NOT NULL, 
    genre_id INT NOT NULL, 
    PRIMARY KEY (film_id, genre_id), 
    FOREIGN KEY (film_id) REFERENCES Films(id) ON UPDATE CASCADE, 
    FOREIGN KEY (genre_id) REFERENCES Genres(id) ON UPDATE CASCADE 
) 

をしかし、私はテーブルにいくつかの値を挿入しようとすると:私はFilmsテーブルに新しい映画を見ることができます

INSERT INTO Films (Title) VALUES ('$title') 
INSERT INTO Genres (Name) VALUES ('$genre') 

と新しいジャンルはGenresですが、 Films_Genresテーブルは更新されません。新しい行はありません(phpMyAdminをチェックしています)。

私は間違っていますか?

+0

PHPコードを貼り付けてください。そうしないと、解決できません。 '$ title'と' $ genre'が存在することを確認しましたか?など。 –

+0

私は映画とジャンルの結果を表示することができます - 彼らは動作します。唯一の問題は、Films_Genresテーブルがすべての行を追加しないことです。 PHPはうまくいくようです。 mysqli_query($ con、$ sql)を使ってSQLコードを実行しています。 SQLは正しいのですか? – Sharkz

+0

「Films_Genres」の接続が不足していることが懸念されています。そうであれば、その2つのレコードを自分で関連付ける必要があります。 –

答えて

15

明示的に何かを挿入するまで、Films_Genresテーブルには何も表示されません。 PKおよびFKによる参照整合性は、テーブルを作成するためのものではありません。それは新しいジャンルに対応し、新たな映画だ場合

Films_Genresに新しいレコードを挿入するためのMySQLのコード、自動インクリメントのために新たに割り当てられたIDを取得するには、PHP側では

INSERT INTO Films (Title) VALUES ('Title1'); 
SET @film_id = LAST_INSERT_ID(); 

INSERT INTO Genres (Name) VALUES ('Genre1'); 
SET @genre_id = LAST_INSERT_ID(); 

INSERT INTO Films_Genres (film_id, genre_id) VALUES(@film_id, @genre_id); 

のようになります。フィールド使用$mysqli->insert_id

今、あなたは新しいフィルムを作成し、ここで

INSERT INTO Films (Title) VALUES ('Title2'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you get ids of genre from your UI just use them 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE id IN (2, 3, 4); 

INSERT INTO Films (Title) VALUES ('Title3'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you names of genres you can use them too 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE Name IN ('Genre2', 'Genre4'); 

を行うことができ、一度に複数のジャンルにそれを割り当てたい場合は、行を挿入する必要があり、デモSQLFiddle基本的に

+0

うわー!私はより良いanwserを期待できなかった!どうもありがとう!私はstackoverflowが好きです:D – Sharkz

+0

@Sharkzあなたは歓迎です:)追加情報については、更新された回答を参照してください。 – peterm

0

ですあなたが挿入したばかりの映画とジャンルをリンクするだけではありません.Mysqlエンジンは自動的にあなたのためにそれを行いません(単に、それらの2つのレコードがどういう関係にあってもわからない) - これはアプリケーション側または手動で行うことができます

INSERT INTO Films_Genres (film_id,genre_id) VALUES (1,1) 
0

あなたは多対多のテーブルを自分で作成する必要があります。これはmysqlの仕組みであり、残念なことにここで実行される自動推測作業はありません。