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 表示相应玩家获胜。
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 表示相应玩家获胜。