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

Postgresql में regclass का क्या अर्थ है

नहीं, आपको regclass . में कास्ट करने की आवश्यकता नहीं है nextval . जैसे फ़ंक्शन को कॉल करते समय जो एक regclass . स्वीकार करता है पैरामीटर, क्योंकि text . से एक अंतर्निहित कास्ट है करने के लिए regclass . कुछ अन्य संदर्भों में regclass . के लिए एक स्पष्ट कलाकार आवश्यकता हो सकती है।

स्पष्टीकरण:

::regclass एक कास्ट है, जैसे ::integer

regclass एक "जादू" डेटा प्रकार है; यह वास्तव में oid . के लिए एक उपनाम है , या "ऑब्जेक्ट आइडेंटिफ़ायर"। देखें ऑब्जेक्ट आइडेंटिफ़ायर प्रकार दस्तावेज़ीकरण में। regclass में कास्ट किया जा रहा है यह कहने का एक शॉर्टकट तरीका है "यह एक रिश्ते का नाम है, कृपया इसे उस रिश्ते के ओड में बदल दें"। regclass में कास्ट करता है search_path . के बारे में जानते हैं , क्वेरी करने के विपरीत pg_class किसी रिश्ते के oid . के लिए सीधे तौर पर, इसलिए regclass को कास्ट करना pg_class सबक्वेरी करने के बिल्कुल समान नहीं है ।

टेबल संबंध हैं। तो अनुक्रम, और विचार हैं। तो आप regclass को भी कास्ट करके किसी दृश्य या अनुक्रम से छुटकारा पा सकते हैं।

text . के लिए परिभाषित निहित जातियां हैं करने के लिए regclass , इसलिए यदि आप स्पष्ट कलाकारों को छोड़ देते हैं और आप एक फ़ंक्शन को कॉल कर रहे हैं जो regclass स्वीकार करता है कास्ट स्वचालित रूप से किया जाता है। तो आप नहीं करते हैं इसकी आवश्यकता है, उदाहरण के लिए, nextval कॉल।

ऐसी अन्य जगहें हैं जहाँ आप हो सकते हैं। उदाहरण के लिए आप text . की तुलना नहीं कर सकते सीधे oid . के साथ; तो आप यह कर सकते हैं:

regress=> select * from pg_class where oid = 'table1'::regclass;

लेकिन यह नहीं:

regress=> select * from pg_class where oid = 'table1';
ERROR:  invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';

केवल मनोरंजन के लिए मैंने एक क्वेरी लिखने की कोशिश की जो regclass . पर कास्ट करने के बराबर ऑपरेशन करती थी . इसका उपयोग न करें, यह ज्यादातर मनोरंजन के लिए है, और वास्तव में क्या हो रहा है यह दिखाने के प्रयास के रूप में है। जब तक आप वास्तव में रुचि नहीं रखते कि पीजी की हिम्मत कैसे काम करती है, आप यहां पढ़ना बंद कर सकते हैं।

जैसा कि मैं इसे समझता हूं, 'sequence_name'::regclass::oid मोटे तौर पर निम्न क्वेरी के बराबर है:

WITH sp(sp_ord, sp_schema) AS (
  SELECT 
    generate_series(1, array_length(current_schemas('t'),1)),
    unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;

सिवाय इसके कि यह बहुत छोटा और बहुत तेज है। देखें सिस्टम जानकारी फ़ंक्शन current_schemas(...) . की परिभाषा के लिए , आदि.

दूसरे शब्दों में:

  • एक ab सरणी प्राप्त करें जिसमें हमारे पास सभी स्कीमा सूचीबद्ध हों और प्रत्येक प्रविष्टि को सरणी में उसकी स्थिति के लिए एक क्रमिक संख्या के साथ जोड़ दें
  • खोज pg_class मेल खाने वाले नामों के साथ संबंधों के लिए और प्रत्येक को उसके नामस्थान (स्कीमा) से संबद्ध करें
  • शेष संबंधों की सूची को उनके स्कीमा search_path में प्रदर्शित होने के क्रम के अनुसार क्रमित करें
  • और पहला मैच चुनें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. datetime_select . के साथ मल्टीपैरामीटर त्रुटि

  2. अभी () फ़ंक्शन से घंटे घटाएं

  3. हाइबरनेट डेटाबेस में तालिका नहीं बनाता है

  4. ClusterControl - उन्नत बैकअप प्रबंधन - PostgreSQL

  5. Generate_series () पर एक गिनती क्वेरी में शामिल हों और शून्य मानों को '0' के रूप में पुनः प्राप्त करें