2009-07-31 27 views
22

एक टेबल नाम दिया गया है, मैं plpgsql फ़ंक्शन से प्राथमिक कुंजी कॉलम और उनके डेटाटाइप की सूची कैसे निकालूं?पोस्टग्रेस से plpgsql के माध्यम से मुझे तालिका की प्राथमिक कुंजी कैसे प्राप्त हो सकती है?

उत्तर

17

क्वेरी ऊपर बहुत बुरा है, क्योंकि यह वास्तव में धीमी है।

http://wiki.postgresql.org/wiki/Retrieve_primary_key_columns

यदि स्कीमा की जरूरत है प्रश्न के रूप में इस प्रकार है

SELECT    
    pg_attribute.attname, 
    format_type(pg_attribute.atttypid, pg_attribute.atttypmod) 
FROM pg_index, pg_class, pg_attribute, pg_namespace 
WHERE 
    pg_class.oid = 'foo'::regclass AND 
    indrelid = pg_class.oid AND 
    nspname = 'public' AND 
    pg_class.relnamespace = pg_namespace.oid AND 
    pg_attribute.attrelid = pg_class.oid AND 
    pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary 
+0

मुझे यकीन है कि आपको pg_namespace से जुड़ने की आवश्यकता नहीं है। Pg_class का ओड अनूठा है, इसलिए जब आप इसे किसी रेगक्लास पर डाल देते हैं तो आप पहले ही स्कीमा नाम का अर्थ दे रहे हैं। यदि आपको स्कीमा नाम की आवश्यकता है तो इसे तालिका के नाम में शामिल करें: 'public.foo' :: regclass। –

+1

"ऊपर दी गई क्वेरी बहुत खराब है क्योंकि यह वास्तव में धीमी है।" कृपया अन्य उत्तरों के पृष्ठ पर सापेक्ष स्थिति का जिक्र करने से बचें क्योंकि यह समय के साथ और चयनित सॉर्ट विधि द्वारा बदलता है। इसके बजाय किसी अन्य उत्तर का जिक्र करने का सबसे भविष्य-सबूत तरीका यह है कि इसे लिंक करना है। – faintsignal

5

pg_constraint सिस्टम तालिका पर एक नज़र डालें। या information_schema.table_constraints देखें कि क्या आप SQL मानक के करीब रहना पसंद करते हैं।

एक पूर्ण उदाहरण के लिए "-E" विकल्प के साथ psql का उपयोग करके डीबी से कनेक्ट करें और \d <some_table> टाइप करें - आपको तालिका का वर्णन करने में उपयोग की जाने वाली वास्तविक क्वेरी दिखाई देगी।

+0

इसके अतिरिक्त, इसे pg_indexes से डेटा के साथ संयोजित करें, और आपको बहुत अच्छा होना चाहिए। वास्तव में एक प्राथमिक कुंजी केवल एक अनूठी अनुक्रमणिका है जो सभी क्षेत्रों में शून्य नहीं है। –

15

एसक्यूएल की एक सीधी बिट, आप के साथ प्राथमिक कुंजी स्तंभ तथा उनके प्रकार सूचीबद्ध कर सकते हैं प्रदान करने के लिए:

SELECT 
c.column_name, c.data_type 
FROM 
information_schema.table_constraints tc 
JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) 
JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema AND tc.table_name = c.table_name AND ccu.column_name = c.column_name 
where constraint_type = 'PRIMARY KEY' and tc.table_name = 'mytable'; 
+2

जब मैं इसे अपने पोस्टग्रेस सर्वर पर चलाता हूं, तो मुझे एक खाली परिणाम सेट मिलता है। पूछने से पहले, मैंने सही तालिका नाम के साथ 'mytable'' को प्रतिस्थापित किया था। क्या मुझे काम करने के लिए एक विशिष्ट संदर्भ या दायरे में होना चाहिए? – 2mac

1

अनुक्रमित से सावधान रहें जहां स्तंभ क्रम तालिका की स्तंभ क्रम से भिन्न है:

मैं इस सरकारी संस्करण की सिफारिश करेंगे। (यानी यदि प्राथमिक कुंजी कॉलम 3, 2, और 1)

निम्न क्वेरी अधिक जटिल है, लेकिन उचित क्रम में कॉलम लौटाती है। ('Indisprimary' खंड निकालें एक मेज पर सभी अनुक्रमित के लिए एक ही जानकारी प्राप्त करने के)

WITH ndx_list AS 
(
    SELECT pg_index.indexrelid 
     FROM pg_index, pg_class 
    WHERE pg_class.relname = 'test_indices_table' 
     AND pg_class.oid = pg_index.indrelid 
     AND pg_index.indisprimary 
), ndx_cols AS 
(
    SELECT pg_class.relname AS index_name, UNNEST(i.indkey) AS col_ndx, i.indisunique, i.indisprimary 
    FROM pg_class, pg_index i 
    WHERE pg_class.oid = i.indexrelid 
     AND pg_class.oid IN (SELECT indexrelid FROM ndx_list) 
) 
    SELECT ndx_cols.index_name, ndx_cols.indisunique, ndx_cols.indisprimary, 
     a.attname, format_type(a.atttypid, a.atttypmod), a.attnum 
    FROM pg_class c, pg_attribute a 
    JOIN ndx_cols ON (a.attnum = ndx_cols.col_ndx) 
    WHERE c.oid = 'test_indices_table'::regclass 
    AND a.attrelid = c.oid 
0

स्तंभ क्रम generate_subscripts का उपयोग कर का संरक्षण:

SELECT 
    a.attname, 
    format_type(a.atttypid, a.atttypmod) 
FROM 
    pg_attribute a 
    JOIN (SELECT *, GENERATE_SUBSCRIPTS(indkey, 1) AS indkey_subscript FROM pg_index) AS i 
    ON 
     i.indisprimary 
     AND i.indrelid = a.attrelid 
     AND a.attnum = i.indkey[i.indkey_subscript] 
WHERE 
    a.attrelid = 'your_table'::regclass 
ORDER BY 
    i.indkey_subscript 
3

निम्नलिखित SQL बयान मेरे लिए काम करता है:

SELECT a.attname 
FROM pg_index i 
JOIN pg_attribute a ON a.attrelid = i.indrelid 
        AND a.attnum = ANY(i.indkey) 
WHERE i.indrelid = 'tablename'::regclass 
AND i.indisprimary; 

इसे सीधे here से लिया गया है।

संबंधित मुद्दे

 संबंधित मुद्दे