![](/img/trans.png)
[英]Setting Foreign Key restraints on Junction table with a compound primary key
[英]Primary Key/Foreign Key for a table with two junction tables
取自教程MySQL主鍵中的參考:
CREATE TABLE roles(
role_id INT AUTO_INCREMENT,
role_name VARCHAR(50),
PRIMARY KEY(role_id)
);
提供有關您的特定問題的信息很困難,因為其中的細節太少了。
根據您的評論“如果一個表具有兩個連接表,它是否需要兩個主鍵?” 。 沒有。
主鍵實際上是用於定義邏輯模型的邏輯概念(設計機制)。 主鍵是一組屬性(列),它們共同唯一標識關系(表)中每個元組(行)的每個末端。 主鍵的規則之一是每個關系只有一個。
如前所述,使用邏輯模型作為創建物理模型的設計,關系變為表,屬性變為列,主鍵可能變為唯一索引。 外鍵可能成為相關表中的索引,依此類推。
許多RDBMS允許在物理表定義中指定PRIMARY KEY。 大多數還允許在物理表上定義FOREIGN KEY。 他們對它們所做的工作可能因一個實現而異。 許多人使用PRIMARY KEY的定義來定義某種UNIQUE INDEX,以強制“必須唯一標識”表中的每條記錄。
因此,不,您的games_directors表不需要,也不需要兩個主鍵。 如果確實選擇指定PRIMARY KEY,則需要指定所有唯一標識games_directors表中記錄的列-最有可能是PRIMARY KEY (game_id, director_id)
。
類似地,游戲表的PRIMARY KEY (game_id)
可能是PRIMARY KEY (game_id)
,導演可能是PRIMARY KEY (director_id)
,對於游戲類型, PRIMARY KEY (game_type_id)
可能是PRIMARY KEY (game_type_id)
。
您可以使用來自games_directors表的外鍵來確保在添加記錄時,游戲表和Directors表中存在相應的Director。 在這種情況下,您的games_directors表將具有兩個外鍵關系(一個與游戲,另一個與導演)。 但是只有一個主鍵。
因此,您可能最終會得到如下結果:
create table games (
game_id integer,
PRIMARY KEY (game_id)
);
create table directors (
director_id integer,
PRIMARY KEY (director_id)
);
CREATE TABLE games_directors (
game_id INTEGER NOT NULL,
director_id INTEGER NOT NULL,
commission_paid DECIMAL(10,2),
PRIMARY KEY (game_id, director_id),
FOREIGN KEY (game_id) REFERENCES games(game_id),
FOREIGN KEY (director_id) REFERENCES directors(director_id)
);
注意:我沒有使用PostgreSql測試以上內容。 該語法應適用於大多數RDBMS,但有些語法可能需要稍作調整。
索引可用於加快對表中各個記錄的訪問。 例如,您可能想在導演名稱或導演ID上創建索引(取決於您最頻繁地訪問該表的方式)。 如果您主要使用以下相等條件訪問Director表: where director_name = 'fred'
那么Director_name上的索引可能有意義。
隨着表中記錄數量的增加,索引變得越來越有用。
我希望這回答了你的問題。 :-)
您的游戲表僅需一個主鍵:它標識每個特定的游戲。 在聯結表中,主鍵由游戲主鍵和導演(或類型)主鍵組成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.