आप सिस्टम कैटलॉग
को क्वेरी कर सकते हैं अद्वितीय बाधाओं . के लिए , विशेष रूप से 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 केस को भी प्रदर्शित करता है:
अद्वितीय अनुक्रमणिका
उपरोक्त दोनों (अद्वितीय और पीके बाधाएं) एक अद्वितीय सूचकांक के माध्यम से कार्यान्वित की जाती हैं। इसके अलावा अद्वितीय सूचकांक . भी हो सकते हैं औपचारिक रूप से घोषित अद्वितीय बाधा के समान ही प्रभावी ढंग से करना। उन सभी को पकड़ने के लिए सिस्टम कैटलॉग को क्वेरी करें 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[] . में कनवर्ट करके इससे निपटता हूं ।
ध्यान रखें कि कैटलॉग तालिकाओं का कार्यान्वयन प्रमुख में बदल सकता है। यह संभावना नहीं है कि ये प्रश्न टूटते हैं, लेकिन संभव है।