PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

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

यह इस बात पर निर्भर करता है कि आप क्या परीक्षण करना चाहते हैं बिल्कुल

सूचना स्कीमा?

"तालिका मौजूद है या नहीं" खोजने के लिए (कोई फर्क नहीं पड़ता कि कौन पूछ रहा है ), सूचना स्कीमा को क्वेरी करना (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');

कलाकारों के समान, लेकिन यह लौटता है ...

<ब्लॉककोट>

... नाम नहीं मिलने पर त्रुटि फेंकने के बजाय शून्य



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्राथमिक कुंजी के रूप में ईमेल पते का प्रयोग करें?

  2. तेजी से परीक्षण के लिए PostgreSQL का अनुकूलन करें

  3. मैं PostgreSQL में अस्थायी रूप से ट्रिगर्स को कैसे अक्षम कर सकता हूं?

  4. कैसे कोट () PostgreSQL में काम करता है

  5. PostgreSQL का उपयोग करके किसी अन्य तालिका को अपडेट करने के लिए ट्रिगर डालें