PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

कैसे अद्वितीय संयुक्त प्राथमिक कुंजी के साथ एक Postgres तालिका बनाने के लिए?

एक अद्वितीय अनुक्रमणिका बनाएं:

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);

सीटीई रैपर केवल एक बार पैरामीटर दर्ज करने की सुविधा के लिए है और कुछ संदर्भों में आवश्यक नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL त्रुटि 'सर्वर से कनेक्ट नहीं हो सका:ऐसी कोई फ़ाइल या निर्देशिका नहीं'

  2. PostgreSQL और TimescaleDB के लिए AppArmor को कैसे कॉन्फ़िगर करें

  3. कॉलम सूचीबद्ध किए बिना, प्रत्येक कॉलम पर समान एकत्रीकरण कैसे करें?

  4. पोस्टग्रेज़ यूयूआईडी जेडीबीसी काम नहीं कर रहा है

  5. स्तंभों के लिए PostgreSQL पंक्ति