2013-04-29 118 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