2017-06-17 71 views
-3

我只是想知道我是否正確使用CHECK約束。我想確保winnerloser行彼此不同。有人可以檢查我的sql是否有效[postgresql]

CREATE TABLE players (
    id SERIAL PRIMARY KEY, 
    player_name VARCHAR 
    ); 

    CREATE TABLE matches (
    id SERIAL PRIMARY KEY, 
    winner INT REFERENCES players(id) ON DELETE CASCADE, 
    loser INT REFERENCES players(id) ON DELETE CASCADE, 
    CHECK (winner <> loser) 
    ); 

還有其他表(如VIEW)使用它們。

CREATE VIEW view_wins AS 
select players.id AS view_wins_id, count(matches.id) AS wins 
FROM players LEFT OUTER JOIN matches 
    ON players.id = matches.winner 
GROUP BY players.id; 

CREATE VIEW view_played AS 
SELECT players.id AS view_played_id, count(matches.id) AS played 
FROM players LEFT OUTER JOIN matches 
    ON players.id = matches.winner OR players.id = matches.loser 
GROUP BY players.id; 

CREATE VIEW standings AS 
SELECT players.id, players.player_name, view_wins.wins AS total_wins, view_played.played AS matches_played 
FROM players, view_wins, view_played 
WHERE players.id = view_wins_id AND players.id = view_played_id 
ORDER BY total_wins DESC; 

CREATE VIEW next_round AS 
SELECT players.id AS player1_id, players.player_name AS player1_name, 
players.id AS player2_id, players.player_name AS player2_name 
FROM standings 
WHERE player1_id.wins = player2_id.wins; 
+0

是的,'check'是罰款。注意:StackOverflow不是要求推薦的站點,工具,庫等的地方。請參閱[我可以在這裏詢問什麼主題?](http://stackoverflow.com/help/on-topic)中的第4點。 – trincot

+0

@trincot哦對不起。你知道任何網站我可以得到我的代碼檢查?這對於像我這樣的初學者會非常有幫助。 – MonocleBoo

+0

要讓人們查看您的(功能)代碼,請參閱[代碼評論](https://codereview.stackexchange.com/help/on-topic)。但請務必首先檢查他們的幫助中心,這樣您就一定會問題。 – trincot

回答

0

CHECK約束是好的,如果winnerloser不能假定NULL值,但在這種情況下,你應該申報的列作爲NOT NULL

如果這些列可以爲NULL,它可能是最好編寫

CHECK (winner <> loser OR winner IS NULL OR loser IS NULL)