我正在尝试在MySQL数据库中创建多对多关系。我有三个表: Films, Genres和Films_Genres。我正在使用以下代码进行设置:
Films
Genres
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')
我可以在Films表中看到新的Film,在表中可以看到新的Genre,Genres但是该Films_Genres表没有更新- 没有新行(我正在通过phpMyAdmin检查)。
我究竟做错了什么?
在Films_Genres表中明确插入内容之前,您将看不到表格中的任何内容。通过PK和FK进行的参照完整性不是为您填充表。
您的用于在中插入新记录的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。
$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 演示