मैं किसी निर्दिष्ट तालिका के लिए सभी स्तंभों को कैसे सूचीबद्ध करूं


292

मैं एक डेटाबेस में जानकारी का एक सटीक टुकड़ा ढूंढ रहा हूं जिसके बारे में मुझे कोई जानकारी नहीं है।

यह एक 3 पार्टी उत्पाद है, वे कुछ सवालों के जवाब देने में धीमे हैं, और मुझे पता है कि डेटा उस db के अंदर पड़ा हुआ है, इसलिए मैं थोड़ा रेट्रो इंजीनियरिंग करना चाहता हूं।

एक तालिका दी गई, क्या इस तालिका के लिए स्तंभों के नामों की सूची होना संभव है?

SqlServer में उदाहरण के लिए, एक तालिका को पुन: प्रयोज्य CREATEकथनों में डंप करना संभव है , जो कि उन सभी स्तंभों को सूचीबद्ध करता है जो तालिका से बना है।


आपके पास डीबी तक किस तरह की पहुंच है?
dezso

@dezso, यह एक अलग मशीन पर है, लेकिन मैं इसमें प्रवेश कर सकता हूं, और psql कमांड लाइन को लॉन्च कर सकता हूं, प्रशासक अधिकारों के साथ
स्टीफन रोलैंड

6
अगर मैं तुम्हें सही ढंग से समझ, आप के बाद कर रहे हैं \dt[+] table_nameमें psql
dezso

1
नहीं। \ dt + स्तंभ नाम को स्पष्ट रूप से प्रदर्शित नहीं करता है। यह केवल "विवरण" फ़ील्ड जोड़ता है।
स्टीफन रोलैंड

12
लेकिन \ d + तालिका का नाम काम करता है!
स्टीफन रोलैंड

जवाबों:


344

\d+ <table_name>पहले से मिली कमांड लाइन के अलावा , आप कॉलम डेटा को देखने के लिए सूचना स्कीम का भी उपयोग कर सकते हैं , का उपयोग करते हुए information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

नोट: ऊपर दिए गए उदाहरण के अनुसार, सुनिश्चित करें कि मान उद्धरणों में संलग्न हैं।


2
Psql में, क्वेरी परिणामों को रैखिक (सारणी के बजाय) का उपयोग करें \x onया \pset expanded onबनाने के लिए और इस प्रकार stackoverflow.com/a/9605093/513397
anishpatel

4
वर्तमान संस्करणों में (9.6 में इसे आज़माया गया) आप \d+ public.*स्कील में अपने सभी तालिकाओं और विचारों का विवरण (स्कीमा + इंडोल / फ़िक्क्स / ट्रिगर्स) प्राप्त करने के लिए psql में कर सकते हैं public। हम अपनी प्री-कमिट हुक लिपि में इसका उपयोग प्रत्येक कमेटी द्वारा किए गए डीबी में बदलावों पर नज़र रखने के लिए करते हैं।
थैलिस के।

4
केवल कॉलम नाम पाने के लिए स्तंभ_नाम का चयन करें
एंड्रयू

82

अन्य उत्तरों के पूरक के रूप में, यहां तक ​​कि कोई चयन कथन जो कोई पंक्तियां नहीं लौटाता है, कॉलम नामों को आपके और एप्लिकेशन कोड तक उजागर करेगा।

select *
from table_name
where false;

अनुमतियाँ इनमें से किसी भी दृष्टिकोण के साथ खेल में आ सकती हैं।


मुझे लगता है कि आप इस एसक्यूएल को psql कमांड को पास करना चाहते हैं। मैं सुझाव देता हूं कि आउटपुट में आश्चर्य से बचने के लिए उस मामले में -no-psqlrc विकल्प का उपयोग करें।
जॉनमुद्द

छिपे हुए स्तंभ है, जो निर्दिष्ट किया जा सकता था के अलावा (pg_class.oid की तरह) का चयन किया जाना
okutane

71

जानकारी स्कीमा धीमी और पक्का तरीका है: यह मानकीकृत और काफी हद तक अन्य डेटाबेस है कि यह समर्थन करने के लिए पोर्टेबल है। और यह प्रमुख संस्करणों में काम करता रहेगा।

हालांकि, सूचना स्कीमा में विचार अक्सर कड़ाई से मानकीकृत प्रारूप को पूरा करने के लिए सिस्टम कैटलॉग से कई तालिकाओं में जुड़ते हैं - जिनमें से अधिकांश समय केवल मृत माल हैं। इससे उनकी गति धीमी हो जाती है
पोस्टग्रैज डेवलपर्स वादे नहीं कर रहे हैं, लेकिन मूल बातें (जैसे यहां क्या जरूरी है) प्रमुख संस्करणों में बदलने नहीं जा रहे हैं।

psql(देशी कमांड-लाइन इंटरफ़ेस), निश्चित रूप से फास्ट लेन को ले जाता है, और स्रोत से सीधे पूछताछ करता है। यदि आप psqlपैरामीटर से-E शुरू करते हैं , तो SQL बैकस्लैश कमांड जैसे \dकि प्रदर्शित होता है। या \set ECHO_HIDDEN onpsql कमांड लाइन से। वहां से शुरू करके आप अपने प्रश्न का उत्तर बना सकते हैं।

एक तालिका दी गई, क्या इस तालिका के लिए स्तंभों के नामों की सूची होना संभव है।

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

क्वेरी करने कीinformation_schema.columns तुलना में तेज़ । अपने EXPLAIN ANALYZEलिए देखने की कोशिश करो । फिर भी मुश्किल से एक बार के लुक-अप के लिए मायने रखता है। लेकिन कई बार दोहराए जाने वाले क्वेरी / फ़ंक्शन में उपयोग किए जाने पर फर्क पड़ सकता है।

दृश्यता में भी सूक्ष्म अंतर हैं। विस्तृत तुलना:


2
वास्तव में ऐसा है कि आप दिखाते हैं -Eऔर लोगों को दिखाते हैं कि psql का वर्ग कैसे प्राप्त करें।
इवान कैरोल

6

psql PostgreSQL 11+ पर

आप एक प्रश्न पर कॉलम प्रकार के लिए देख रहे हैं, तो आप उपयोग कर सकते हैं psqlकी\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)

0

केवल PostgreSQL

यह कुछ हद तक खोखला है, लेकिन अगर आप कम से कम संभावित एसक्यूएल की तलाश में हैं तो एक दावेदार हो सकता है:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

या उससे भी कम (यह मानते हुए कि तालिका में कम से कम एक पंक्ति मौजूद है)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

सूची क्रम को संरक्षित करती है। मामले में आप आदेश के बारे में परवाह नहीं है और hstoreविस्तार स्थापित है आप भी कम कर सकते हैं

SELECT skeys(hstore(NULL::schema_name.table_name))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.