2013-08-24 51 views
0

我准备在我创建的电影数据库中填充几个表。 Movies表已经被创建。它看起来像这样:MySQL:M:N Table链接两个表

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

或许应当指出的是,我使用MySQL-pythonScrapy来填充MySQL数据库这个数据,但也许这并不重要。

我创建了三个尚未填充的附加表格:Producers,ActorsDirectors。其中每个看起来像另一个,因为存在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 ActorActor表包含从Moviemovieidactorid并没有title列现有的Actors表。

我估计有两种方法可以做到这一点:

第一种方式:

获取所有的数据到Actorstitle充当foreign key和然后创建Movie To Actor表,加入合适ids其中movies.title等于Actors.title,然后从Actors中删除title列。

第二种方式:

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

回答

1

一对夫妇分折:

  • 除非你手动填充在演员和电影表中的actorId和movieid领域,你应该对这些列的AUTO_INCREMENT。
  • 如果您使用movies.title链接到其他任何内容,则应该在movies表中为该列添加唯一索引。
  • 您最终应该从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_acto独立表(例如,添加演员后,您可以设置他/她所在的任何电影,只需将一个映射添加到movie_actor表中即可)。那么如果你想获得一个演员的电影列表,你可以只是

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

谢谢您花时间阅读和发布!因此,重申并确保我明白你的想法我应该做的事:我应该首先填充'演员'表,包括'title'列。然后,我应该使用上面编写的'INSERT SELECT'语句填充'movie_actor'表。那么我应该从'Actors'表中删除'title'列(减少冗余)? – DMML

+0

实际上,对于已经存在标题列的任何演员,查询将同时从演员和电影中“选择”。如果确实需要重新设计输入以从演员中删除标题列,并将映射直接放置在movie_actor表中,则不需要填充actors.title的额外步骤。这只是一次性移动。 – ChicagoRedSox

+0

好的。所以,我最初可以这样做'INSERT SELECT',从'Actors'放下'title',然后设置'TRIGGER',以防将来',我决定增加更多的演员? – DMML