Foreign-Key
來自多個表/多個外鍵的複合主鍵
我想建構一個由來自兩個不同表的外鍵組成的複合主鍵。我對此還是很陌生…
在這個問題上從多個外鍵建構複合鍵給出了一個很好的答案,但我想從多個表中做到這一點。我正在使用 Oracle 11g。
foreign key (Name, BoughtFrom, TimeBought) references the_other_table_name (Name, BoughtFrom, TimeBought)
想像一下,“references”行實際上包含多個表。我什至不確定上述語法是否適用於 Oracle。
我有一張桌子“學生”和一張桌子“父母”。這是一個多對多的關係。我的關聯表名為“Relation”,我想從“PAR_ID”和“STU_ID”創建一個複合主鍵。兩者都是外鍵。
簡潔版本:
CREATE TABLE Relation ( stu_id INT NOT NULL REFERENCES Student, par_id INT NOT NULL REFERENCES Parent, PRIMARY KEY (stu_id, par_id) ) ;
長版:
- 為什麼要使用縮寫形式的名稱,例如
stu_id
andpar_id
?為什麼不student_id
呢?節省輸入 3-4 個字元?您將如何區分 parent_id 和 parameter_id?還是 school_id 和 schoolmaster_id?- 該名稱
"Relation"
對於關係的描述性不是很強。(另請注意,在關係模型術語中,“關係”的含義與“表”非常接近。)雖然我無法取一個好名字,所以我們可以使用"Guardian"
or"Student_Parent"
(這種組合經常用於交集表中)- 上面的簡短版本只是一個例子。在它工作的時候,它使用了很多快捷方式,比如內聯引用。在我看來,命名所有約束並在列聲明之後聲明所有(主、唯一、外鍵和檢查)約束要好得多,如下面的長版本。
- 選擇一些命名約定並在所有表中一致地使用它們也是很好的,例如
Tablename_PK
用於主鍵、ReferencedTable_referencingTable_FK
用於外鍵、Something_UQ
用於唯一約束等。CREATE TABLE Guardian ( -- columns student_id INT NOT NULL, parent_id INT NOT NULL, -- constraints CONSTRAINT Guardian_PK -- the name of the PK constraint PRIMARY KEY (student_id, parent_id), CONSTRAINT Student_Guardian_FK -- the name of the FK constraint FOREIGN KEY (student_id) REFERENCES Student (student_id) ON UPDATE CASCADE -- the actions of the FK ON DELETE RESTRICT, CONSTRAINT Parent_Guardian_FK -- second FK FOREIGN KEY (parent_id) REFERENCES Parent (parent_id) ON UPDATE CASCADE ON DELETE RESTRICT ) ;