Foreign-Key

如何引用具有兩個外鍵作為主鍵的行?

  • September 21, 2019

我目前正在嘗試建立一個數據庫來管理比賽的球員和球隊。球員以兩人一組的方式比賽,但可能會被洗牌。

由於每個團隊組合只能存在一次,因此我決定每個團隊的主鍵由其中玩家的兩個 id 組成:

CREATE TABLE teams (
 player1 INTEGER REFERENCES User(id) NOT NULL,
 player2 INTEGER REFERENCES User(id) NOT NULL,
 rating INTEGER NOT NULL,
 PRIMARY KEY (player1, player2)
);

比賽由比賽組成,每場比賽為三場。

我想在比賽中引用兩支球隊:

CREATE TABLE matches (
 id INTEGER PRIMARY KEY NOT NULL,
 team_1 INTEGER REFERENCES Team(id) NOT NULL,
 team_2 INTEGER REFERENCES Team(id) NOT NULL,
 timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)

每場比賽都包含獲勝和失敗球隊的得分:

CREATE TABLE games(
 id INTEGER PRIMARY KEY NOT NULL,
 match_id: INTEGER REFERENCES Match(id) NOT NULL,
 score_winner : INTEGER NOT NULL,
 score_loser : INTEGER NOT NULL
)

由於我不知道這樣一場比賽的獲勝者,我想添加贏得比賽的球隊的主鍵,以便能夠找出比賽的獲勝者(誰贏得了最多的比賽)/

如何引用給定表格中游戲的獲勝者?

我在這裡要做的是有一個表 match_winner!它將是一個JOINing 表(也更正式地稱為 anASSOCIATIVE ENTITY以及頁面中的許多其他名稱)。

我不太清楚為什麼你有兩張桌子叫matches-games它們不是一回事嗎?如果沒有,請告訴我,我將修改架構。

恕我直言,您需要這樣的東西。teams它是和之間的連接表matches

CREATE TABLE match_winner
(
 match_id INTEGER NOT NULL,
 team_id  INTEGER NOT NULL,
 winning_score INTEGER NOT NULL CHECK (winning_score > 0),

 CONSTRAINT 'match_winner_pk' PRIMARY KEY (match_id, team_id),
 CONSTRAINT 'mw_match_fk'     FOREIGN KEY (match_id) REFERENCES matches (match_id),
 CONSTRAINT 'mw_team_fk'      FOREIGN KEY (team_id)  REFERENCES teams   (team_id) 
);

我對您的架構進行了小修改 - 我將 a放入了團隊表定義中 - 在這裡id INTEGER SERIAL查看小提琴。s很棒!我還添加了一個約束。SERIAL``CHECK (player1 != player2)

然後我執行了這個 SQL

SELECT t.player1, t.player2, m.id, mw.match_id, mw.team_id, mw.winning_score
FROM teams t
JOIN matches m ON t.player1 = m.team_1 AND t.player2 = m.team_2
JOIN match_winner mw ON m.id = mw.match_id;

您可以在小提琴上檢查結果。擁有連接表可以避免使用NULL並提供額外的靈活性。只是一些建議 - 對 SQL 關鍵字使用大寫字母,對您自己的變數使用小寫字母 - 或相反 - 只需選擇一個標準並堅持下去。您還應該像我為match_winner表格命名的那樣命名您的約束 - 以這種方式找出錯誤消息要容易得多。

我希望這能回答您的問題 - 如果沒有,請告訴我!ps 歡迎來到論壇!;-)

糟糕——我幾乎沒有註意到這個問題。我顛倒了我對您的團隊架構的修改 - 請參閱此處的小提琴,但 SQL 完全相同。要使用兩個欄位PRIMARY KEY,您只需加入兩個欄位,而不僅僅是一個簡單的欄位id- 等等!當然,你可以有id限制UNIQUE條件,有時會更容易一些 - 只是我想給你球員的身份。我在這裡添加了一個進一步的小提琴,展示瞭如何在同一個查詢中對一個表進行兩次別名來做有用的事情——在這裡將 player1 和 player2 的名稱加入到你的結果中。

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