我在Postgres数据库中有两个表,分别命名为players
和matches
,具体如下:
CREATE TABLE players (
name text NOT NULL,
id serial PRIMARY KEY
);
CREATE TABLE matches (
winner int REFERENCES players (id),
loser int REFERENCES players (id),
-- to prevent rematch btw players
CONSTRAINT unique_matches
PRIMARY KEY (winner, loser)
);
如何确保只有唯一的组合可以用于匹配主键,这组合要么是 (胜利者,失败者)
,要么是 (失败者,胜利者)
,以使 matches
表不允许插入以下内容:
INSERT INTO matches VALUES (2, 1);
如果已经有一行包含
VALUES (1, 2)
,例如: winner | loser
--------+-------
1 | 2
目标是避免同一玩家之间的比赛匹配。
serial
列作为PK而不是我之前的方式(PRIMARY KEY(winner, loser)
)有什么原因吗?再次感谢:) - Babak KPRIMARY KEY (winner, loser)
这样做是可行的。而且,使用两个整数列也非常高效。如果您在表中有 FK 引用,那么使用单列代理 PK 可能更简单。 - Erwin Brandstetter