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

कैसे पता लगाएं कि दिए गए कॉलम के लिए अद्वितीय कुंजी बाधा मौजूद है या नहीं?

आप सिस्टम कैटलॉग को क्वेरी कर सकते हैं अद्वितीय बाधाओं . के लिए , विशेष रूप से pg_constraint और pg_attribute :

SELECT c.conname, pg_get_constraintdef(c.oid)
FROM   pg_constraint c
JOIN  (
   SELECT array_agg(attnum::int) AS attkey
   FROM   pg_attribute
   WHERE  attrelid = 'tb'::regclass  -- table name optionally schema-qualified
   AND    attname  = ANY('{c1,c2}') 
   ) a ON c.conkey::int[] <@ a.attkey AND c.conkey::int[] @> a.attkey
WHERE  c.contype  = 'u'
AND    c.conrelid = 'tb'::regclass;
  • ऑब्जेक्ट पहचानकर्ता प्रकार regclass आपकी तालिका को स्पष्ट रूप से पहचानने में मदद करता है।

  • सिस्टम कैटलॉग जानकारी फ़ंक्शन pg_get_constraintdef() आपको अच्छी तरह से स्वरूपित जानकारी देता है, जो आपके अनुरोध के लिए कड़ाई से आवश्यक नहीं है।

  • साथ ही सरणी ऑपरेटरों का उपयोग करना <@ और @> यह सुनिश्चित करने के लिए कि सरणियाँ पूरी तरह से मेल खाती हैं। (स्तंभों का क्रम अज्ञात है।) सिस्टम स्तंभ हैं smallint और smallint[] क्रमश। integer . पर कास्ट करें उन ऑपरेटरों के साथ काम करने के लिए।

  • सिस्टम कैटलॉग में सीधे देखने पर कॉलम नाम केस सेंसिटिव होते हैं। अगर आपने C1 . को डबल-कोट नहीं किया है और C2 निर्माण के समय, आपको c1 . का उपयोग करना होगा और C2 इस संदर्भ में।

  • एक बहु-स्तंभ प्राथमिक कुंजी बाधा भी हो सकती है विशिष्टता को लागू करना। इसे क्वेरी में शामिल करने के लिए इसके बजाय उपयोग करें:

    WHERE  c.contype IN ('u', 'p')
    

@Roman's fiddle पर निर्माण, यह pk केस को भी प्रदर्शित करता है:

->SQLfiddle

अद्वितीय अनुक्रमणिका

उपरोक्त दोनों (अद्वितीय और पीके बाधाएं) एक अद्वितीय सूचकांक के माध्यम से कार्यान्वित की जाती हैं। इसके अलावा अद्वितीय सूचकांक . भी हो सकते हैं औपचारिक रूप से घोषित अद्वितीय बाधा के समान ही प्रभावी ढंग से करना। उन सभी को पकड़ने के लिए सिस्टम कैटलॉग को क्वेरी करें pg_index इसके बजाय, इसी तरह से:

SELECT c.relname AS idx_name
FROM  (
   SELECT indexrelid, string_to_array(indkey::text, ' ')::int[] AS indkey
   FROM   pg_index
   WHERE  indrelid = 'tb'::regclass
   AND    indisunique                    -- contains "indisprimary"
   ) i
JOIN  (
   SELECT array_agg(attnum::int) AS attkey
   FROM   pg_attribute
   WHERE  attrelid = 'tb'::regclass
   AND    attname  = ANY('{c1,c2}')
   ) a ON i.indkey <@ a.attkey AND i.indkey @> a.attkey
JOIN   pg_class c ON c.oid = i.indexrelid;

यहां विशेष कठिनाई आंतरिक प्रकार है int2vector . मैं टेक्स्ट कास्ट करके और int[] . में कनवर्ट करके इससे निपटता हूं ।

ध्यान रखें कि कैटलॉग तालिकाओं का कार्यान्वयन प्रमुख में बदल सकता है। यह संभावना नहीं है कि ये प्रश्न टूटते हैं, लेकिन संभव है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दूसरी तालिका से केवल एक आइटम प्राप्त करने के लिए दो तालिकाओं (मुख्य और कई-से-एक उप-तालिका) को बाहरी कैसे करें?

  2. क्या मैं गतिशील रूप से टेबल को छोटा कर सकता हूं?

  3. IntelliJ में DataSource, JNDI API के साथ कार्य करना

  4. दिनांक सीमाओं के बीच पोस्टग्रेस्क्ल क्वेरी

  5. WHERE क्लॉज में एक कॉलम नाम उपनाम का संदर्भ लें