这就是你要做的。首先,发行人与电影之间的关系是一对多的-
发行人可以发行许多电影,但每部电影只有一个发行人。但是,电影类型是多对多的关系(您声明一部电影是多种类型,但也有一种类型是许多电影的情况),因此您应该为该关系准备一个额外的表。
本质上:
publisher: publisher_id publisher_name <other publisher info>type: type_id type_name <other type info>movie: movie_id movie_name publisher_id references publisher(publisher_id) <other movie info>movie_type: movie_id references movie(movie_id) type_id references type(type_id)
并为所有这些提供合适的主键。
然后,假设您已插入发布者和类型,则可以这样插入影片:
begin transaction;insert into movie (movie_name,publisher_id) values ( 'Avatar', (select publisher_id from publisher where publisher_name = 'Spielberg'));insert into movie_type (movie_id,type_id) values ( (select movie_id from movie where movie_name = 'Avatar'), (select type_id from type where type_name = 'SciFi'));insert into movie_type (movie_id,type_id) values ( (select movie_id from movie where movie_name = 'Avatar'), (select type_id from type where type_name = 'GrownUpSmurfs'));commit;
换句话说,您使用子选择基于一组 唯一 的属性从相关表中获取ID
(上面的示例假定电影名称是唯一的,实际上,您将需要更具体的查询,例如处理不同的电影同名:例如,“欧米茄(Omega)男人”。
如果您使用的DBMS不支持值部分中的selects,那么最好的选择可能就是记住或使用所使用的任何编程语言将相关值提取到变量中,或者构造一个查询来完成。用伪代码:
begin transaction;insert into movie (movie_name,publisher_id) values ( 'Avatar', (select publisher_id from publisher where publisher_name = 'Spielberg'));select movie_id into :m_id from movie where movie_name = 'Avatar';select type_id into :t_id1 from type where type_name = 'SciFi';select type_id into :t_id2 from type where type_name = 'GrownUpSmurfs';insert into movie_type (movie_id,type_id) values (:m_id, :t_id1);insert into movie_type (movie_id,type_id) values (:m_id, :t_id2);commit;
针对您的评论:
嘿,我没说类型和电影关系的意思..请您详细说明这一点..关于阿比德
Avatar和Solaris都可以视为SciFi类型。如此多的电影属于一种类型。Xmen:Wolverine既可以视为动作,也可以视为漫画翻拍。一部电影有这么多种类型。
多对多关系最好用一个单独的表来表示,该表包含两个相关表之间的交叉匹配。



