Mysql

確保來自外國記錄的其他列的完整性

  • May 29, 2020

我有 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() 這樣的視窗函式,這對於此類計算非常有用。

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