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');
这两个查询基本相同,都是允许的。我的问题是,是否有办法不允许第二个查询?
答案 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表示相应玩家的胜利。