MySQL 与外键的多对多关系

2022-08-31 01:10:27

我正在尝试在我的MySQL数据库中创建一个多对多的关系。我有三个表:、 和 。我使用以下代码来设置它们:FilmsGenresFilms_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')

我可以在表格中看到新的电影,在表格中看到新的流派,但表格没有更新 - 没有新行(我正在通过phpMyAdmin检查)。FilmsGenresFilms_Genres

我做错了什么?


答案 1

在表中显式插入某些内容之前,您不会在表中看到任何内容。通过 PK 和 FK 的参照完整性不用于为您填充表。Films_Genres

用于在 中插入新记录的 MySql 代码(如果它是对应于新类型的新电影)可能如下所示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 $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 演示


答案 2

你必须自己填写多对多表,这就是mysql的工作方式,不幸的是,这里没有自动猜测工作。


推荐