2012-04-10 9 views
10

मैंने देखा है कि यह psql में निम्न कमांड का प्रयोग असंवेदनशील नाम केस करने के लिए सभी टेबल कन्वर्ट करने के लिए संभव है:मैं अपने डेटाबेस में सभी स्तंभों में बदल सकते हैं केस के प्रति असंवेदनशील

\o /tmp/go_to_lower 
select 'ALTER TABLE '||'"'||tablename||'"'||' RENAME TO ' || 
lower(tablename)||';' from pg_tables where schemaname = 'public'; 
psql -U username database < /tmp/go_to_lower 

मैं असमर्थ रहे हैं उसी तरह असंवेदनशील होने के लिए सभी कॉलम को परिवर्तित करने के लिए कमांड का पता लगाने के लिए। यह कैसे हासिल किया जा सकता है?

संपादित करें: जाहिर है उपर्युक्त कोड केवल तालिका के नाम को कम मामले में परिवर्तित करता है। मुझे पता है कि यह कोड वैकल्पिक तालिका "YourTableName" आपके TableName को नाम दें; तालिका नाम के लिए असंवेदनशील मामले में परिवर्तित हो जाएगा। कॉलम नामों के लिए द्रव्यमान पर समान कार्य करने का कोई तरीका है?

+1

यदि यह आपके लिए कोई फर्क पड़ता है, तो यह मामला असंवेदनशील नहीं है; जो उन्हें सभी को कम मामले में परिवर्तित कर रहा है। –

+0

यह उन्हें केस असंवेदनशील बनाता है क्योंकि कॉलम नामों के नाम पर उनका उद्धरण नहीं होता है। – CSharpened

+0

क्या आप डेटा की तुलना करते समय कॉलम ** नाम ** केस असंवेदनशील या कॉलम ** मान ** बनाना चाहते हैं? –

उत्तर

11

मूल के समान लाइनों के साथ, तो, आप निम्न कार्य करने में सक्षम होना चाहिए। यह उन सभी कॉलमों का नाम बदलता है जो पहले से कम मामले में नहीं हैं, उन्हें info_schema से निकालने, परिवर्तनों के लिए एसक्यूएल उत्पन्न करने, फ़ाइल को संग्रहीत करने के बाद फिर से SQL को निष्पादित करते हैं।

\t on 
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME COLUMN '||'"'||column_name||'"'||' TO ' || lower(column_name)||';' 
from information_schema.columns 
where table_schema = 'public' and lower(column_name) != column_name 
\g /tmp/go_to_lower 
\i /tmp/go_to_lower 
+0

क्या यह सिर्फ एक कॉलम के लिए नहीं है? – CSharpened

+0

नहीं, यह उन सभी के लिए है। मैंने लेआउट को स्पष्ट करने के लिए अद्यतन किया है और क्वेरी को और अधिक चालाक होने के लिए बदल दिया है (ताकि यह पहले से ही कम मामले में कॉलम का नाम बदलने का प्रयास न करे)। –

+0

यदि आपको अनुक्रमों के लिए ऐसा करने की आवश्यकता है: 'चुनें' वैकल्पिक SEQUENCE '||' '' || sequence_name || '' '||' नाम बदलें '|| कम (sequence_name) || ';' info_schema.sequences जहां sequence_schema = 'public' और low (sequence_name)! = sequence_name; ' –

15

डिफ़ॉल्ट रूप से, आप सभी पहचानकर्ता केस असंवेदनशील होते हैं, और आंतरिक रूप से PostgreSQL उन्हें लोअरकेस में संग्रहीत करता है। मामले में आप की जरूरत है:

  • केस संवेदी
  • गैर- ASCII वर्ण
  • विशेष वर्ण

अपने पहचानकर्ता के भीतर, आप दोहरे उद्धरण चिह्नों (") अपने पहचानकर्ता के आसपास का उपयोग करना चाहिए।

कृपया, पोस्टग्रेएसक्यूएल दस्तावेज के देखें।

संपादित करें: अपने स्पष्टीकरण के बाद, आप का उपयोग कर सकते हैं:

SELECT 'ALTER TABLE '||quote_ident(t.relname)||' RENAME TO '||t.relname||';' 
    FROM pg_class t, pg_namespace s 
WHERE s.oid = t.relnamespace AND s.nspname = 'public' 
    AND t.relkind='r' AND t.relname != lower(t.relname) 
ORDER BY 1; 

और स्तंभों के लिए:

SELECT 'ALTER TABLE '||quote_ident(t.relname)|| 
     ' RENAME COLUMN '||quote_ident(a.attname)|| 
     ' TO '||a.attname||';' 
    FROM pg_class t, pg_namespace s, pg_attribute a 
WHERE s.oid = t.relnamespace AND s.nspname = 'public' 
    AND t.relkind='r' 
    AND a.attrelid = t.oid AND NOT a.attisdropped AND a.attnum > 0 
    AND a.attname != lower(a.attname) 
ORDER BY 1; 

फिर उत्पादन अपने ग्राहक में कॉपी-पेस्ट करें।

आप psql का उपयोग कर रहे हैं, तो आप पंक्तियों-ओनली मोड वास्तविक स्टेटमेंट्स को निष्पादित करने, अस्थायी फ़ाइल में उत्पादन बचाने के लिए और अंत में, करने के लिए, सक्षम करने के लिए \o <full_file_path>\i <full_file_path>\t उपयोग कर सकते हैं।

+0

यह समस्या के पीछे कारणों का एक अच्छा स्पष्टीकरण है, लेकिन वास्तव में ओपी के सवाल का समाधान नहीं है। –

+2

@ElYobo ओपी यह नहीं बताता कि समस्या क्या है। वह एक टिप्पणी में संकेत देता है कि उसे उपनाम का उपयोग करने में समस्याएं हैं। तो ऐसा लगता है कि वह एक ऐसी समस्या का समाधान कर रहा है जो वह अनुभव नहीं कर रहा है। –

+0

शायद हम एक अलग सवाल पढ़ रहे हैं, या इसे संपादन द्वारा बदला गया है? मैं उपर्युक्त निम्नलिखित देख सकता हूं - "मैं सभी कॉलम को उसी तरह असंवेदनशील करने के लिए कमांड को खोजने में असमर्थ हूं। यह कैसे प्राप्त किया जा सकता है?"। –

0
do language plpgsql $$ 
declare 
    r record; 
begin 
    for r in 
     select relname, attname 
     from pg_attribute a 
     inner join pg_class c on a.attrelid = c.oid 
     inner join pg_namespace n on c.relnamespace = n.oid 
     where 
      n.nspname = 'public' 
      and 
      attname != lower(attname) 
      and 
      not attisdropped 
    loop 
     execute format(' 
      alter table %1$I rename column %2$I to %3$s 
     ', r.relname, r.attname, lower(r.attname)); 
    end loop; 
end; 
$$; 

जारी करना एक begin; इस प्रयास करने से पहले। जांचें कि यह सही है या नहीं। केवल तभी commit; जारी करें। यदि आप नामस्थान का उपयोग कर रहे हैं तो इसे where खंड में प्रतिस्थापित करें।

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