一意のインデックスを作成します:
CREATE UNIQUE INDEX matches_uni_idx ON matches
(greatest(winner, loser), least(winner, loser));
UNIQUE
になることはできません またはPRIMARY KEY
制約。これらは列でのみ機能し、式では機能しないためです。
serial
を追加できます 列はPKとして機能しますが、整数列が2つしかないため、元のPKも非常に効率的です(コメントを参照)。そして、両方の列をNOT NULL
にします 自動的。 (それ以外の場合は、NOT NULL
を追加します 制約。)
CHECK
を追加することもできます 自分と対戦するプレーヤーを除外するための制約:
CHECK (winner <> loser)
ヒント:IDのペア(誰が勝ったかわからない場合)を検索するには、同じ式をクエリに組み込むと、インデックスが使用されます:
SELECT * FROM matches
WHERE greatest(winner, loser) = 3 -- the greater value, obviously
AND least(winner, loser) = 1;
不明なパラメータを処理していて、どちらが優れているかが事前にわからない場合:
WITH input AS (SELECT $id1 AS _id1, $id2 AS _id2) -- input once
SELECT * FROM matches, input
WHERE greatest(winner, loser) = greatest(_id1, _id2)
AND least(winner, loser) = least(_id1, _id2);
CTEラッパーは、パラメーターを1回だけ入力するためのものであり、一部のコンテキストでは必要ありません。