如何引用具有兩個外鍵作為主鍵的行?
我目前正在嘗試建立一個數據庫來管理比賽的球員和球隊。球員以兩人一組的方式比賽,但可能會被洗牌。
由於每個團隊組合只能存在一次,因此我決定每個團隊的主鍵由其中玩家的兩個 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!它將是一個
JOIN
ing 表(也更正式地稱為 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 的名稱加入到你的結果中。