2013-04-29 120 views
0

我对使用主键或外键时有点困惑。我有两个表,并且在其中的一些列中,某些列引用的列是其他表中的主键。 这里,他们是:Oracle外键或主键

CREATE TABLE roles (
movie_id NUMBER(10,0) NOT NULL REFERENCES movies(movie_id), 
actor_id NUMBER(10,0) NOT NULL REFERENCES actors(actor_id), 
movie_description VARCHAR2(50), 
salary NUMBER(10), 
CONSTRAINT pk_roles PRIMARY KEY (movie_id, actor_id) 
); 

CREATE TABLE profits (
movie_id NUMBER(10,0) NOT NULL, 
gross_profit NUMBER(9) NOT NULL, 
net_profit NUMBER(9) NOT NULL, 
CONSTRAINT fk_profits FOREIGN KEY (movie_id) REFERENCES movies(movie_id) ON DELETE CASCADE 
); 

在我已与在其他表中的列德两列的复合主键的第一个表。这些列恰好是各自表中的主键。

在第二个表中,我再次引用了一个外键,它引用了另一个表中的主键。但最佳做法是什么?第一个表中的键是否应该是外键,因为它引用了其他表中的主键?

回答

1

主键约束和唯一约束可防止重复行。重复的行不仅浪费空间,而且使得从数据库中获得有意义的答案变得更加困难。

外键约束将值限制为存在于另一个表中的值。外键约束的目标通常是主键,但它可以是任何具有唯一约束的列。

每个表都应该有一个主键约束。如果构成主键的列也需要外键约束,那么也要添加外键约束。

就实现主键约束和外键约束而言,您的表“角色”没有问题。但“利润”需要一个主键。

+0

因此,外键约束是主键约束的附加内容,并将值限制为外键列中的值?这是否会使“角色”中的“... REFERENCES ...”语句失效,因为我没有在那里创建外键? – Amoeba 2013-04-29 16:43:21

+1

您正在“角色”中创建两个外键约束。在'movie_id ... REFERENCES movies(movie_id)'中,您需要电影才能存在,然后才能存储有关演员在该电影中播放角色的信息。在'actor_id ...参考actor(actor_id)'中,你需要演员存在,然后才能存储关于演员演奏的电影的信息。这两种外键约束都非常有意义。 – 2013-04-29 18:52:15

+0

我如何获得上面的利润表并且执行'movie_id NUMBER(10,0)NOT NULL REFERENCES movies(movie_id)'和约束如'CONSTRAINT pk_profits PRIMARY KEY(movie_id)''会有什么区别? – Amoeba 2013-04-29 19:33:05