2013-07-03 117 views
10

我想在我的MySQL數據庫中創建一個多對多的關係。我有三個表格: Films,GenresFilms_Genres。我使用下面的代碼來設置它們:MySQL與FOREIGN KEYS的多對多關係

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 
) 

然而,當我嘗試插入一些值表用:

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

我可以看到新的電影在Films表和新表在Genres表中,但 Films_Genres表不更新 - 沒有新行(我正在通過phpMyAdmin檢查)。

我在做什麼錯?

+0

粘貼PHP代碼,或者我們無能爲力。你有沒有驗證'$ title'和'$ genre'存在?等.. –

+0

我可以顯示電影和流派的結果 - 他們的工作。唯一的問題是Films_Genres表不添加任何行。 PHP似乎很好。我使用mysqli_query($ con,$ sql)來執行SQL代碼。 SQL是否正確? – Sharkz

+0

因此,我假設在'Films_Genres'丟失的連接是你關心的問題。如果是這種情況,您需要自己將這兩條記錄關聯起來。 –

回答

15

只有在您明確插入某些內容後,纔會在Films_Genres表中看到任何內容。 通過PK和FK引用完整性不是爲你填充你的表。

Films_Genres插入新記錄,如果它是對應於一個新的流派一個新的電影,可能看起來像

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

在PHP端得到​​一個新分配的ID爲自動增量您的MySQL代碼現場使用$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

哇!我無法預料會有更好的an魚!非常感謝!我喜歡計算器:D – Sharkz

+0

@Sharkz不客氣:)查看更新的答案以獲得更多信息。 – peterm

0

基本上,你應該插入行鏈接表以及'鏈接'你剛剛插入的電影和流派.Mysql引擎不會爲你自動做到這一點(它根本不知道那兩個記錄應該有某種相關性) - 這是爲了可以在應用程序端或手動完成

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

你必須自己填充多對多的表,這就是mysql的工作原理,不幸的是,這裏沒有自動猜測工作。