2014-10-29 7 views
6

मुझे पोस्टग्रेएसक्यूएल 9.3 का उपयोग करके यह अजीब समस्या है जो qoutes का उपयोग करके बनाए गए टेबल के साथ है। उदाहरण के लिए, अगर मैं qoutes का उपयोग कर एक तालिका बनाने:पोस्टग्रेएसक्यूएल त्रुटि: 42 पी 01: रिलेशनशिप "[टेबल]" मौजूद नहीं है

create table "TEST" ("Col1" bigint); 

तालिका ठीक से बनाई गई है और मैं देख सकता हूँ कि उद्धरण संरक्षित कर रहे हैं जब दृश्य यह pgAdminIII की एसक्यूएल फलक में। लेकिन जब मैं सभी उपलब्ध तालिकाओं (नीचे दी गई क्वेरी का उपयोग करके) की सूची खोजने के लिए डीबी से पूछता हूं, तो मुझे लगता है कि परिणाम तालिका के नाम के चारों ओर उद्धरण नहीं है।

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema'; 

के बाद तालिका उद्धरण के साथ बनाया गया था, मैं तालिका नाम सीधे ऊपर क्वेरी से लौटे उपयोग नहीं कर सकते, क्योंकि यह गैर उद्धृत है और शीर्षक में पोस्ट में त्रुटि फेंकता है।

मैं सभी प्रश्नों में उद्धरण के साथ तालिका नामों के आस-पास कोशिश कर सकता हूं लेकिन मुझे यकीन नहीं है कि यह हर समय काम करेगा या नहीं। मैं तालिका नामों की सूची प्राप्त करने का एक तरीका ढूंढ रहा हूं जो परिणाम में उद्धरण के साथ उद्धृत हैं।

मुझे कॉलम नामों के साथ भी एक ही समस्या है, लेकिन मुझे उम्मीद है कि अगर मुझे तालिका नाम के मुद्दे का समाधान मिल सकता है, तो एक समान समाधान कॉलम नामों के लिए भी काम करेगा।

उत्तर

15

आपके पास दो विकल्प हैं: - कोई उद्धरण नहीं: तो सब कुछ स्वचालित रूप से लोअरकेस और गैर-केस-संवेदी होगा - उद्धरण के साथ: अब से सबकुछ केस संवेदनशील है।

मैं उद्धरणों का उपयोग न करने और पोस्टग्रेएसक्यूएल को गैर केस संवेदनशील व्यवहार करने की अत्यधिक अनुशंसा करता हूं। यह जीवन को इतना आसान बनाता है। एक बार जब आप उद्धरण प्राप्त कर लेते हैं तो आपको इसका उपयोग करना पड़ता है क्योंकि PostgreSQL बहुत सटीक होना शुरू हो जाएगा।

कुछ उदाहरण:

TEST = test  <-- non case sensitive 
    "Test" <> Test <-- first is precise, second one is turned to lower case 
    "Test" = "Test" <-- will work 
    "test" = TEST  <-- should work; but you are just lucky. 

वास्तव में किसी भी कीमत पर प्रवंचना के इस प्रकार से बचने की कोशिश। ऑब्जेक्ट नामों के लिए 7 बिट एसीआईआई के साथ रहें।

+0

+1। – Othya

+0

सहमत हैं कि PostgreSQL में उद्धरणों का उपयोग नहीं करना जीवन आसान बनाता है लेकिन मेरे मामले में हमेशा संभव नहीं है क्योंकि मेरा एप्लिकेशन डेटाबेस नहीं बनाता है। यह तीसरे पक्ष PostgreSQL डेटाबेस से डेटा पढ़ने में सक्षम होना चाहिए और मैं नियंत्रित नहीं कर सकता कि दूसरों द्वारा टेबल कैसे बनाए जाते हैं। किसी भी मामले में, आश्चर्य की बात यह है कि PostgreSQL मुझे यह नहीं बताता है कि एक निश्चित तालिका उद्धरण के साथ बनाई गई थी, लेकिन जब मैं एक क्वेरी में एक अज्ञात तालिका नाम का उपयोग करता हूं, तो यह इसकी अनुमति नहीं देता है। –

+1

यह स्वचालित रूप से जानता है कि जैसे ही एक गैर-लोअरकेस अक्षर होता है, उद्धरणों का उपयोग किया जाता था। इसलिए यदि कोई तालिका टेस्ट के रूप में सूचीबद्ध है या तो इसका पहले से ही मतलब है कि आपको केस संवेदनशील होना चाहिए। –

0

इस्तेमाल किया उपयुक्त रूप से एक SQL विवरण स्ट्रिंग में पहचानकर्ता को उद्धृत करने के एक स्ट्रिंग समारोह quote_ident(), (संबंधित quote_literal() साथ संयोजन के रूप में प्रयोग किया जाता है), जो संदर्भ देता है एक good example है।

अपने उदाहरण का उपयोग, और अन्य परिणामों में मिश्रण करने के लिए: कोई उद्धरण का उपयोग करने के

select 
    quote_ident(table_schema) as table_schema, 
    quote_ident(table_name) as table_name 
... 

table_schema | table_name 
--------------+------------------ 
... 
public  | good_name 
public  | "table" 
public  | some_table 
public  | "something else" 
public  | "Tom's work" 
public  | "TEST" 
... 
संबंधित मुद्दे