psql瑞士锦标赛系统 - 防止2名玩家之间的重赛

时间:2015-07-16 19:45:08

标签: database-design database-schema psql unique-constraint

CREATE TABLE matches (
  match_id BIGSERIAL PRIMARY KEY,
  tournamentid INTEGER,
  winner_id INTEGER,
  loser_id INTEGER CHECK (winner_id != loser_id),
  draw BOOLEAN,
  FOREIGN KEY(tournamentid, winner_id) REFERENCES enroll(tournament,   player_id),
  FOREIGN KEY(tournamentid, loser_id) REFERENCES enroll(tournament, player_id),
  UNIQUE(tournamentid, winner_id, loser_id)
);

这是当前的匹配表架构。我试图找出一种方法来防止玩家1两次与玩家2比赛。所以例如我有以下几点:

INSERT INTO匹配(tournamentid,winner_id,loser_id,draw)VALUES('1','2','3','false');

INSERT INTO匹配(tournamentid,winner_id,loser_id,draw)VALUES('1','3','2','false');

这两个查询基本相同,都是允许的。我的问题是,是否有办法不允许第二个查询?

1 个答案:

答案 0 :(得分:0)

我认为你不能用这个架构来做。一些DBMS允许检查约束中的子查询,这可以在这里使用。

相反,您可以尝试:

SELECT USER_ID
FROM TABLE
WHERE DATEDIFF( month, DATE, GETDATE()) > 6 AND USER_ID NOT IN
    (
        SELECT USER_ID
        FROM TABLE
        WHERE DATEDIFF( month, DATE, GETDATE()) <= 6
    )

其中0表示平局,1或2表示相应玩家的胜利。