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

psql swiss tournament system - prevent rematches between 2 player

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)
);

这是当前匹配 table 架构。我想找出一种方法来防止玩家 1 与玩家 2 对战两次。所以例如我有以下内容:

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

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

这两个查询本质上是相同的,都将被允许。我的问题是是否有办法禁止第二个查询?

我不认为你可以用那个模式来做。一些 DBMS 允许在检查约束中使用子查询,这本可以在这里使用。

相反,您可以尝试:

CREATE TABLE matches (
  match_id BIGSERIAL PRIMARY KEY,
  tournamentid INTEGER,
  player1_id INTEGER,
  player2_id INTEGER CHECK (player1_id < player2_id),
  result SMALLINT CHECK (result IN (0, 1, 2)),
  FOREIGN KEY(tournamentid, player1_id) REFERENCES enroll(tournament, player_id),
  FOREIGN KEY(tournamentid, player2_id) REFERENCES enroll(tournament, player_id),
  UNIQUE(tournamentid, player1_id, player2_id)
);

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