【问题标题】:MySQL many-to-many relationship with FOREIGN KEYSMySQL 与 FOREIGN KEYS 的多对多关系
【发布时间】:2013-07-01 20:06:34
【问题描述】:

我正在尝试在我的 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')

我可以在Films 表中看到新电影,在Genres 表中看到新类型,但是 Films_Genres 表没有更新 - 没有新行(我正在通过 phpMyAdmin 检查)。

我做错了什么?

【问题讨论】:

  • 粘贴PHP代码,否则我们无能为力。您是否验证了$title$genre 存在?等等。
  • 我可以展示电影和流派的结果——它们有效。唯一的问题是 Films_Genres 表没有添加任何行。 PHP 看起来不错。我使用 mysqli_query($con, $sql) 来执行 SQL 代码。 SQL 是否正确?
  • 所以我假设Films_Genres 中的连接缺失是您关心的问题。如果是这种情况,您需要自己关联这两条记录。

标签: php mysql sql foreign-keys many-to-many


【解决方案1】:

除非您在其中明确插入某些内容,否则您不会在 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演示

【讨论】:

  • 哇!我没想到会有更好的答案!非常感谢!我喜欢stackoverflow:D
  • @Sharkz 不客气 :) 查看更新的答案以获取更多信息。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    基本上,您还应该在链接表中插入一行以“链接”您刚刚插入的电影和类型。Mysql 引擎不会自动为您执行此操作(它根本不知道那些2 条记录应该以某种方式相关)- 这是在应用程序端或手动完成的

    INSERT INTO Films_Genres (film_id,genre_id) VALUES (1,1)
    

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 2011-04-05
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多