MySQL:M:N表链接两个表

MySQL:M:N表链接两个表,mysql,sql-update,mysql-python,Mysql,Sql Update,Mysql Python,我准备在我创建的电影数据库中填充几个表。已创建电影表。看起来是这样的: movieid INT NOT NULL PRIMARY KEY title VARCHAR(50) link VARCHAR(100) release_date VARCHAR(10) 可能需要注意的是,我正在使用MySQL-python和Scrapy在MySQL数据库中填充这些数据,但这可能并不重要 我创建了另外三个尚未填充的表:制作人、演员和导演。每一个都看起来像另一个,存在id、name和电影标题。因此,

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

 movieid INT NOT NULL PRIMARY KEY
 title VARCHAR(50)
 link  VARCHAR(100)
 release_date VARCHAR(10)
可能需要注意的是,我正在使用
MySQL-python
Scrapy
MySQL
数据库中填充这些数据,但这可能并不重要

我创建了另外三个尚未填充的表:
制作人
演员
导演
。每一个都看起来像另一个,存在
id
name
电影标题
。因此,
Actors
看起来像:

 actorid INT NOT NULL PRIMARY KEY
 actor   VARCHAR(40)
 title   VARCHAR(50)    <<<<------ This is the movie title from the Movies tables
actorid INT非空主键
演员瓦查尔(40)

title VARCHAR(50)先得几分:

  • 除非手动填充actors和movies表中的actorid和movieid字段,否则这些列应该具有自动增量
  • 如果使用movies.title链接到其他任何内容,则应在movies表的该列中添加唯一索引
  • 最终应该从actors表中删除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=????

感谢您花时间阅读和发布!因此,为了重申并确保我理解您认为我应该做的事情:我应该首先填充
Actors
表,包括
title
列。然后,我应该使用上面编写的
INSERT SELECT
语句填充
movie\u actor
表。然后我应该从
Actors
表中删除
title
列(减少冗余)?实际上,对于已经填充了title列的演员,该查询将同时从Actors和movies中选择
。如果确实重新设计了输入,从actors中删除title列,而将映射直接放在movie_actor表中,则不需要额外的填充actors.title步骤。这只是一次移动。好的。因此,我可以先执行
INSERT SELECT
,从
Actors
中删除
title
,然后设置
TRIGGER
,以防将来我决定添加更多的Actors?我编写的触发器要求Actors表中存在title列(
NEW.title
)。我想说的是,最好的设计是这样做:将电影添加到电影表中。将演员添加到演员表。添加标识哪些演员在哪些电影中的映射(电影演员表)。3个单独的行动。这将允许最大的灵活性,因为你不会强迫自己在一部电影中添加一个演员。但是,为了保持整洁,如果从相应的表中删除了相应的movieid或actorid,您可能还需要从movie_actor中删除触发器。