2017-06-17 86 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)