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