我正在尝试在MySQL数据库中创建多对多关系。我有三张桌子:
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
表格中看到新电影,在Genres
表格中看到新电影但是
Films_Genres
表没有更新 - 没有新行(我正在通过phpMyAdmin检查)。
我做错了什么?
答案 0 :(得分:15)
在明确插入内容之前,您不会在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 演示
答案 1 :(得分:0)
基本上,你应该在链接表中插入一行以“链接”你刚刚插入的电影和类型.Mysql引擎不会自动为你做这些(它根本不知道那些2记录应以某种方式相关) - 这应在应用程序端或手动完成
INSERT INTO Films_Genres (film_id,genre_id) VALUES (1,1)
答案 2 :(得分:0)
你必须自己填充多对多表,这就是mysql的工作方式,不幸的是,这里没有自动猜测工作。