Foreign-Key

來自多個表/多個外鍵的複合主鍵

  • September 10, 2019

我想建構一個由來自兩個不同表的外鍵組成的複合主鍵。我對此還是很陌生…

在這個問題上從多個外鍵建構複合鍵給出了一個很好的答案,但我想從多個表中做到這一點。我正在使用 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_idand par_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
) ;

引用自:https://dba.stackexchange.com/questions/77695