2012-06-08 14 views
23

क्या कोई जानता है कि पोस्टग्रेस 9.1 में किसी तालिका के ओआईडी को कैसे ढूंढें? मैं एक अद्यतन स्क्रिप्ट लिख रहा हूं जिसे कॉलम बनाने की कोशिश करने से पहले तालिका में कॉलम के अस्तित्व के परीक्षण की आवश्यकता है। यह पहली बार त्रुटि से बाहर होने के बाद स्क्रिप्ट को चलाने से रोकने के लिए है।पोस्टग्रेज़ 9.1 में किसी तालिका के ओआईडी को निर्धारित करना?

उत्तर

18

पोस्टग्रेस कैटलॉग तालिका pg_class आपको यह देखना चाहिए कि आपको क्या देखना चाहिए। कॉलम relname में तालिका नाम के साथ प्रति पंक्ति एक पंक्ति होनी चाहिए, और छुपा कॉलम oid में ओड होना चाहिए।

कैटलॉग टेबल postgres डेटाबेस में हैं, इसलिए अपने एप्लिकेशन डेटाबेस की बजाय उससे कनेक्ट करना सुनिश्चित करें।

आपको pg_attribute कैटलॉग तालिका में भी रुचि हो सकती है, जिसमें प्रति पंक्ति कॉलम में एक पंक्ति शामिल है।

देखें: http://www.postgresql.org/docs/current/static/catalog-pg-class.html और http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html

+1

मैं 'pg_class' और' pg_attribute' टेबल पर डॉक्स देखा था, लेकिन मुझे नहीं पता था एक छिपे हुए 'pg_class' तालिका में' oid' नामित स्तंभ नहीं है। मैं यह नहीं समझ सका कि ओड दस्तावेज़ों से कहाँ था। धन्यवाद! –

+6

यह काफी सटीक नहीं है। प्रत्येक डेटाबेस में 'pg_catalog' नामक स्कीमा होती है, जिसमें डेटाबेस के लिए विशिष्ट कैटलॉग टेबल होते हैं। –

+0

मैं दूसरा @ टोनी विटाबिल। यह छुपा कॉलम 'ओआईडी' था जिसे मैं ढूंढ रहा था। –

31

एक मेज OID प्राप्त करने के लिए एक सरल तरीका है। search_path में पहली स्कीमा के

SELECT 'mytbl'::regclass::oid; 
यह चूक या एक अपवाद को जन्म देती है, तो नहीं मिला: object-identifier class regclass (कनेक्ट रहते हुए संबंधित डीबी करने के लिए) के लिए कास्ट।
या स्पष्ट रूप स्कीमा योग्य: बाद में तुम भी to_regclass('mytbl') उपयोग कर सकते हैं

SELECT TRUE AS col_exists 
FROM pg_attribute 
WHERE attrelid = 'mytbl'::regclass 
AND attname = 'mycol' 
AND NOT attisdropped -- no dropped (dead) columns 
-- AND attnum > 0  -- no system columns (you may or may not want this) 

Postgres 9.4 में या:

SELECT 'myschema.mytbl'::regclass::oid; 

तो फिर तुम केवल स्तंभ के अस्तित्व के लिए सूची तालिका pg_attribute का निरीक्षण करने की जरूरत है , जो टेबल नहीं मिला है, तो अपवाद नहीं उठाता है:

2

बस संभावनाओं को पूरा करने मैं जोड़ने के लिए कोई त्रुटि बाहर करने के लिए कॉलम को छोड़ने के लिए एक वाक्य रचना मौजूद है करना चाहते हैं:

ALTER तालिका mytbl ड्रॉप स्तंभ अगर मौजूद है mycol

http://www.postgresql.org/docs/9.0/static/sql-altertable.html

फिर आप सुरक्षित रूप से अपना कॉलम जोड़ सकते हैं।

0
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r'; 
+1

स्पष्टीकरण अच्छा होगा ... – eirikir

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