0

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

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

或许应该注意的是,我正在使用MySQL-pythonScrapyMySQL数据库中填充这些数据,但也许这并不重要。

我创建了三个尚未填充的附加表ProducersActorsDirectors。这些中的每一个看起来都像另一个,因为存在id,namemovie 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,其中包含表中movieidMovie表和表中actorid的表,并且Actor表中不存在该titleActors

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

第一种方式:

将所有数据放入Actors表中,title充当 aforeign key然后创建Movie To Actor表,添加适当的idswheremovies.title等于Actors.title然后title从 中删除列Actors

第二种方式:

在我填充数据时执行此操作。首先创建Movie to Actor表,设置键约束并将其设置为在数据添加到Actors表时自动更新。我更喜欢这个,因为它使事情变得容易得多,而且我认为在风格上更好。希望有人能指导我如何去做。我想我可以弄清楚如何将指令推断MySQLMySQL-python,但需要有关如何执行前者的帮助。

4

1 回答 1

1

首先有几点:

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

对于您提到的第一种方法,您实际上可以创建 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=????
于 2013-08-24T18:44:21.997 回答