我正在尝试在我的
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,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表不更新 – 没有新行(我正在通过PHPMyAdmin检查).
我究竟做错了什么?
在您明确插入某些内容之前,您将不会在Films_Genres表中看到任何内容.
PK和FK的参照完整性不是为您填写表.
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
.
现在,如果你想创建一个新的电影,并将它分配给多个流派,你可以做
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,id FROM Genres WHERE Name IN ('Genre2','Genre4');
这是SQLFiddle演示