यह इस बात पर निर्भर करता है कि आप क्या परीक्षण करना चाहते हैं बिल्कुल ।
सूचना स्कीमा?
"तालिका मौजूद है या नहीं" खोजने के लिए (कोई फर्क नहीं पड़ता कि कौन पूछ रहा है ), सूचना स्कीमा को क्वेरी करना (information_schema.tables
) गलत . है , कड़ाई से बोलते हुए, क्योंकि (प्रति दस्तावेज़ीकरण):
केवल उन्हीं तालिकाओं और दृश्यों को दिखाया जाता है कि वर्तमान उपयोगकर्ता के पास (मालिक होने या कुछ विशेषाधिकार होने के कारण) पहुंच है।
@kong द्वारा प्रदान की गई क्वेरी FALSE
return लौटा सकती है , लेकिन तालिका अभी भी मौजूद हो सकती है। यह प्रश्न का उत्तर देता है:
कैसे जांचें कि कोई तालिका (या दृश्य) मौजूद है और वर्तमान उपयोगकर्ता के पास उस तक पहुंच है?
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
);
सूचना स्कीमा मुख्य रूप से प्रमुख संस्करणों में और विभिन्न आरडीबीएमएस में पोर्टेबल रहने के लिए उपयोगी है। लेकिन कार्यान्वयन धीमा है, क्योंकि पोस्टग्रेज को मानक (information_schema.tables
का अनुपालन करने के लिए परिष्कृत विचारों का उपयोग करना पड़ता है। बल्कि एक सरल उदाहरण है)। और कुछ जानकारी (जैसे OID) सिस्टम कैटलॉग से अनुवाद में खो जाती है - जो कि वास्तव में है सभी जानकारी ले जाएं।
सिस्टम कैटलॉग
आपका प्रश्न था:
कैसे जांचें कि कोई तालिका मौजूद है या नहीं?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
AND c.relkind = 'r' -- only tables
);
सिस्टम कैटलॉग का उपयोग करें pg_class
और pg_namespace
सीधे, जो काफी तेज भी है। हालांकि, प्रति दस्तावेज़ pg_class
. पर :
कैटलॉग pg_class
कैटलॉग टेबल और बाकी सब कुछ जिसमें कॉलम हैं या अन्यथा एक टेबल के समान हैं। इसमें सूचकांक . शामिल हैं (लेकिन यह भी देखें pg_index
), अनुक्रम , दृश्य , भौतिक दृश्य , समग्र प्रकार , और टोस्ट टेबल;
इस विशेष प्रश्न के लिए आप सिस्टम दृश्य pg_tables
. का भी उपयोग कर सकते हैं . प्रमुख पोस्टग्रेज़ संस्करणों में थोड़ा सरल और अधिक पोर्टेबल (जो इस मूल क्वेरी के लिए शायद ही कोई चिंता का विषय है):
SELECT EXISTS (
SELECT FROM pg_tables
WHERE schemaname = 'schema_name'
AND tablename = 'table_name'
);
पहचानकर्ताओं को सभी के बीच अद्वितीय होना चाहिए ऊपर वर्णित वस्तुएं। अगर आप पूछना चाहते हैं:
कैसे जांचें कि किसी स्कीमा में किसी तालिका या समान वस्तु के लिए नाम लिया गया है या नहीं?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
);
- dba.SE पर संबंधित उत्तर "सूचना स्कीमा बनाम सिस्टम कैटलॉग" पर चर्चा करते हुए
वैकल्पिक:regclass
में कास्ट करें
SELECT 'schema_name.table_name'::regclass
यह अपवाद उठाता है यदि (वैकल्पिक रूप से स्कीमा-योग्य) तालिका (या उस नाम पर मौजूद अन्य वस्तु) मौजूद नहीं है।
यदि आप तालिका नाम को स्कीमा-योग्य नहीं बनाते हैं, तो regclass
. के लिए एक कास्ट करें search_path
. पर डिफ़ॉल्ट और पहली तालिका के लिए OID लौटाता है - या अपवाद यदि तालिका किसी भी सूचीबद्ध स्कीमा में नहीं है। ध्यान दें कि सिस्टम स्कीमा pg_catalog
और pg_temp
(वर्तमान सत्र की अस्थायी वस्तुओं के लिए स्कीमा) स्वचालित रूप से search_path
. का हिस्सा हैं ।
आप इसका उपयोग कर सकते हैं और किसी फ़ंक्शन में संभावित अपवाद पकड़ सकते हैं। उदाहरण:
- जांचें कि पोस्टग्रेज (plpgsql) में अनुक्रम मौजूद है या नहीं
ऊपर जैसा प्रश्न संभावित अपवादों से बचा जाता है और इसलिए थोड़ा तेज़ होता है।
to_regclass(rel_name)
पोस्टग्रेज में 9.4+
अब बहुत आसान:
SELECT to_regclass('schema_name.table_name');
कलाकारों के समान, लेकिन यह लौटता है ...
<ब्लॉककोट>... नाम नहीं मिलने पर त्रुटि फेंकने के बजाय शून्य