我创建了一个db名称movielibrarysystem,其中我有3个表..
是类型,发布者和电影...现在1个发布者可以有很多电影,1个电影有很多类型..在电影表中,发布者ID和typeid都充当外键。
我的问题是如何将数据插入电影表...我已经将数据插入发布者和类型表但我无法插入电影表..
答案 0 :(得分:2)
这是你做的。首先,出版商和电影之间的关系是一对多的 - 出版商可以发布许多电影,但每部电影只有一个出版商。但是,类型到电影是一种多对多的关系(你说一部电影有很多类型,但也有一种类型是很多电影的情况),所以你应该为这种关系增加一个表。 / p>
本质:
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 Man。
如果您没有使用支持值部分选择的DBMS,那么您最好的选择可能只是记住或使用您正在使用的任何编程语言将相关值提取到变量,并构建查询来执行此操作。在伪代码中:
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:金刚狼可以被认为是动作和漫画翻拍。一部电影的种类很多。
多对多关系最好用一个单独的表来表示,该表包含两个相关表之间的交叉匹配。
答案 1 :(得分:0)
如果限制表类型和发布者使用外键,则需要先将两个ID插入到影片表中。如果可能的话,我会让电影表成为增加外键的那个。