एक अद्वितीय अनुक्रमणिका बनाएं:
CREATE UNIQUE INDEX matches_uni_idx ON matches
(greatest(winner, loser), least(winner, loser));
UNIQUE
नहीं हो सकता या PRIMARY KEY
बाधा, क्योंकि वे केवल कॉलम के साथ काम करते हैं, अभिव्यक्ति नहीं।
आप एक serial
add जोड़ सकते हैं कॉलम पीके के रूप में सेवा करने के लिए, लेकिन केवल दो पूर्णांक कॉलम के साथ, आपका मूल पीके भी बहुत कुशल है (टिप्पणियां देखें)। और यह दोनों कॉलम NOT NULL
. बनाता है खुद ब खुद। (अन्यथा, जोड़ें NOT NULL
बाधाएं।)
आप एक CHECK
भी जोड़ सकते हैं अपने खिलाफ खेलने वाले खिलाड़ियों को बाहर करने के लिए बाध्यता:
CHECK (winner <> loser)
संकेत:आईडी की एक जोड़ी खोजने के लिए (जहां आप नहीं जानते कि कौन जीता), अपनी क्वेरी में वही भाव बनाएं, और अनुक्रमणिका का उपयोग किया जाएगा:
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);
सीटीई रैपर केवल एक बार पैरामीटर दर्ज करने की सुविधा के लिए है और कुछ संदर्भों में आवश्यक नहीं है।