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中删除触发器。