簡體   English   中英

MySQL與FOREIGN KEYS的多對多關系

[英]MySQL many-to-many relationship with FOREIGN KEYS

我試圖在我的MySQL數據庫中創建多對多關系。 我有三張桌子: FilmsGenresFilms Films_Genres 我使用以下代碼進行設置:

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

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

我究竟做錯了什么?

在您明確插入內容之前,您不會在Films_Genres表中看到任何內容。 通過PK和FK的參照完整性不適合為您填充表格。

用於在Films_Genres插入新記錄的MySql代碼,如果它是對應於新類型的新電影,可能看起來像

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使用$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演示

基本上,你應該在鏈接表中插入一行,以“鏈接”你剛剛插入的電影和類型.Mysql引擎不會自動為你做這件事(它根本不知道那2條記錄應該以某種方式相關) - 這是在應用程序端或手動完成

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM