Mysql
確保來自外國記錄的其他列的完整性
我有 3 張桌子:
Race - id PK Racer - id PK - rank Winner - id PK - race_id FK(Race.id) - racer_id FK(Racer.id) - rank - prize UNIQUE CONSTRAINT (race_id, rank)
Racer.rank
是一個非唯一值,因為某些玩家可以綁定到一個等級。我嘗試讓記錄Winner
與其引用的rank
匹配。Racer.rank
唯一的限制是確保每場比賽只有一個第一名。
Winner.rank
和之間的完整性Racer.rank
是為了強制執行,如果我們稍後更新Racer.rank
,我們也必須更新其中的值Winner
,或者刪除該Winner
行。如何強制執行該匹配?其他單獨的問題: - 是否有描述我嘗試完成的關鍵字?我嘗試使用“參照完整性”、“外來約束非唯一”進行搜尋……但沒有一個能讓我得到滿意的結果。
以下是評論的粗略草圖:
CREATE TABLE Race ( Race_id INT NOT NULL PRIMARY KEY -- I prefer to use the same name through out the model ); CREATE TABLE Racer ( Racer_id INT NOT NULL PRIMARY KEY -- See above , Rank INT NOT NULL , CONSTRAINT AK1_Racer UNIQUE (Rank, Racer_id) -- Super key ); CREATE TABLE Result -- Is not "Result" a better name than Winner? -- I removed id ( Race_id INT NOT NULL , Racer_id INT NOT NULL , Rank INT NOT NULL -- See below , ... , CONSTRAINT PK_Result PRIMARY KEY (Race_id, Racer_id) , CONSTRAINT AK_Result UNIQUE (Race_id, Rank) , CONSTRAINT FK_Race FOREIGN KEY (Race_id) REFERENCES Race (Race_id) , CONSTRAINT FK_Racer FOREIGN KEY (Rank, Racer_id) REFERENCES Racer (Rank, Race_id) );
編輯:
我不確定為什麼 RANK 是 RACER 的一部分。似乎所有可能的排名都可以從 WINNER (RESULT) 中得出:
SELECT Racer_id , COUNT(1) as #races , AVG(Rank) as avg_rank , MIN(Rank) as lowest_rank , MAX(Rank) as highest_rank , ... FROM Result -- Winner GROUP BY Racer_id
如果有其他一些指標(例如分數、時間等)來確定每場比賽的排名,您也可以考慮儲存它並從中得出排名。PostgreSQL 和更新版本的 MySQL 具有像 RANK() 這樣的視窗函式,這對於此類計算非常有用。