微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – MySQL与FOREIGN KEYS的多对多关系

我正在尝试在我的 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的参照完整性不是为您填写表.

您的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演示

原文地址:https://www.jb51.cc/php/131167.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐