MySQL:M:N表链接两个表

时间:2013-08-24 17:18:24

标签: mysql sql-update mysql-python

我正准备在我创建的电影数据库中填充几个表格。已创建Movies表。它看起来像这样:

 movieid INT NOT NULL PRIMARY KEY
 title VARCHAR(50)
 link  VARCHAR(100)
 release_date VARCHAR(10)

或许应该注意,我正在使用MySQL-pythonScrapyMySQL数据库中填充此数据,但这可能无关紧要。

我创建了另外三个尚未填充的表:ProducersActorsDirectors。其中每个都与另一个相似,因为存在idnamemovie title。所以Actors看起来像是:

 actorid INT NOT NULL PRIMARY KEY
 actor   VARCHAR(40)
 title   VARCHAR(50)    <<<<------ This is the movie title from the Movies tables

现在,我想创建一个名为Movie To Actor的表,其中包含movieid表中的Movieactorid表中的Actor title表中没有Actors列。

我认为有两种方法可以做到这一点:

第一种方式:

将所有数据放入Actors表中,title作为foreign key,然后创建Movie To Actor表,添加相应的ids其中movies.title等于Actors.title,然后从title删除Actors列。

第二种方式:

这样做,因为我正在填充数据。首先创建Movie to Actor表,设置关键约束并将其设置为自动更新,因为数据已添加到Actors表中。我更喜欢这个,因为它使事情变得更加容易,我认为风格更好。希望有人能指导我如何做到这一点。我想我可以弄清楚如何将MySQL中的说明推断为MySQL-python,但需要有关如何做前者的帮助。

1 个答案:

答案 0 :(得分:1)

首先关注几个点:

  • 除非你手动填充演员和电影表中的actorid和movieid字段,否则你应该在这些列上有一个auto_increment。
  • 如果您使用movies.title链接到其他任何内容,则应在影片表格中为该列添加唯一索引。
  • 您最终应该从actors表中删除标题列。否则,您将拥有相同演员名称的多行(冗余)或每个演员只有一部电影(不切实际)。

对于您提到的第一种方法,您实际上可以首先创建movie_actor表,然后然后填充现有数据:

INSERT INTO movie_actor (movieid, actorid) SELECT movieid, actorid FROM movies INNER JOIN actors ON actors.title=movies.title;

对于第二个,您可以使用触发器:

delimiter //
CREATE TRIGGER add_actor
AFTER INSERT ON actors
FOR EACH ROW BEGIN
SET @movieid = (SELECT movieid FROM movies WHERE title=NEW.title);
IF @movieid IS NOT NULL THEN
    INSERT INTO movie_actor (movieid, actorid) VALUES (@movieid, NEW.actorid);
END IF;
END;
//
delimiter ;

我建议使用选项1,然后使用任何形式来填充这些表以独立填充movie_actor表(例如,在添加演员之后,您可以设置他/她所在的任何电影,只需添加映射到movie_actor表)。然后,如果你想获得一个演员的电影列表,你可以

SELECT title FROM movie_actor
INNER JOIN movies ON movies.movieid=movie_actor.movieid
WHERE actorid=????