वाइल्डकार्ड का उपयोग करके PostgreSQL में कई टेबल कैसे छोड़ें


84

विभाजन के साथ काम करते समय, अक्सर एक ही बार में सभी विभाजन हटाने की आवश्यकता होती है।

तथापि

DROP TABLE tablename*

काम नहीं करता। (वाइल्डकार्ड सम्मानित नहीं है)।

क्या वाइल्डकार्ड के साथ एक कमांड में कई तालिकाओं को छोड़ने का एक सुरुचिपूर्ण (पढ़ें: याद रखना आसान) तरीका है?

जवाबों:


117

अल्पविराम से अलग सूची का उपयोग करें:

DROP TABLE foo, bar, baz;

यदि आपको वास्तव में एक फुटगन की जरूरत है, तो यह एक काम करेगा:

CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT) 
RETURNS void 
LANGUAGE plpgsql
AS
$$
DECLARE
    row     record;
BEGIN
    FOR row IN 
        SELECT
            table_schema,
            table_name
        FROM
            information_schema.tables
        WHERE
            table_type = 'BASE TABLE'
        AND
            table_schema = _schema
        AND
            table_name ILIKE (_parttionbase || '%')
    LOOP
        EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
        RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
    END LOOP;
END;
$$;

SELECT footgun('public', 'tablename');

3
जवाब के लिए धन्यवाद! तालिकाओं की एक छोटी सूची छोड़ने के लिए एक अल्पविराम से अलग की गई सूची महान है। हालांकि, एक बार (या अधिक) में 20 तालिकाओं को छोड़ने के लिए यह व्यावहारिक नहीं है। मैं प्रश्न को स्पष्ट करने के लिए वापस करूंगा।
टॉम फेनर

2
क्षमा करें, यह एकमात्र विकल्प आपके पास है। आप इसके लिए एक संग्रहित फंक्शन का निर्माण कर सकते हैं, लेकिन एक अच्छा मौका है कि आप अपने आप को पैर में गोली मार लेंगे: बहुत सी मेजें
गिराना

4
जोड़ा गया, मज़ा! और लापरवाह बनो, यह आपके पूरे डेटाबेस को नष्ट कर सकता है।
फ्रैंक हाइकेन

बस गायब है || ' CASCADE ';और यह सही है
एमएफएआरआईडी

28

इस समस्या का एक और हैकिश जवाब है। यह काम करता है ubuntuऔर शायद कुछ अन्य ओएस भी। एक ऐसा \dtpostgres में शीघ्र आदेश (कमांड प्रॉम्प्ट के अंदर चल रहा था genome-terminalमेरे मामले में)। फिर आपको टर्मिनल में बहुत सारी टेबल दिखाई देंगी। अब सभी तालिकाओं के नामों की प्रतिलिपि बनाने ctrl+click-dragके genome-terminalलिए कार्यक्षमता का उपयोग करें । यहाँ छवि विवरण दर्ज करेंअजगर खोलें, कुछ स्ट्रिंग प्रसंस्करण ('' द्वारा '' और फिर '\ n' द्वारा ',') करें और आपको सभी तालिकाओं की अल्पविराम से अलग की गई सूची मिलती है। अब Psql शेल में a drop table CTRL+SHIFT+Vऔर आप कर रहे हैं। मुझे पता है कि यह बहुत विशिष्ट है जिसे मैं बस साझा करना चाहता था। :)


यह महान काम करता है, यह आपको आसानी से स्पष्ट करने में सक्षम बनाता है कि आप क्या करना चाहते हैं।
ब्रैड कोच

5
मुझे क्या इसी तरह की है, मैं लिखने: DROP TABLE whatever_और फिर टैब दबाएं, क्लिपबोर्ड, खुले उदात्त, ढूँढ़ें / बदलें, और रेगुलर एक्सप्रेशन का उपयोग बदलने के, करने के लिए सभी तालिकाओं नकल \s+के लिए ,और टर्मिनल पर पेस्ट करें।
अल्फांसो पेरेज़

हाँ, यह 5 से कई तालिकाओं के लिए है। एक लंबी सूची के लिए, टेबल नामों के लिए एक क्वेरी चलाएं, psql से अपने संपादक का उपयोग करके किक आउट करें \e, अपनी सूची में कॉपी करें और अल्पविराम लगाएं ।
मर्लिन

इसके अलावा, pgadmin3 में यदि आप स्कीमा नाम का चयन करते हैं, और फिर 'डिपेंडेंट्स' टैब पर जाएं, तो आप सभी तालिकाओं (शिफ्ट कुंजी का उपयोग करके) का चयन कर सकते हैं और फिर CTRL + C. का उपयोग करके उन सभी को कॉपी कर सकते हैं। फिर DROS TABLE बनाने के लिए कुछ टेक्स्ट एडिटर का उपयोग करें [ नाम, ..] क्वेरी।
मेट Mimović

18

मैंने इसका इस्तेमाल किया।

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

dbnameऔर के लिए उपयुक्त मूल्यों में स्थानापन्न name%


14

मैंने हमेशा महसूस किया है कि मैं अपनी समीक्षा करने और परीक्षण करने से पहले एक सीक्वल स्क्रिप्ट बनाने के लिए और अधिक आरामदायक महसूस कर सकता हूं, क्योंकि मैं इसे केवल सही तरीके से चलाने के लिए निर्भर करता हूं ताकि यह मेरे डेटाबेस को उड़ा न दे। बैश में कुछ सरल है जो कैटलॉग से टैक्लेनेम का चयन करता है, फिर मेरे लिए ड्रॉप स्टेटमेंट बनाता है। तो 8.4.x के लिए आपको यह मूल क्वेरी मिलेगी:

SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" 
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','S','')
     AND n.nspname <> 'pg_catalog'
     AND n.nspname <> 'information_schema'
     AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid);

जहाँ आप एक खंड को जोड़ सकते हैं। ( where c.relname ilike 'bubba%')

आउटपुट इस तरह दिखता है:

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;

तो, इसे एक .sql फ़ाइल में सहेजें और इसे psql -f filename.sql के साथ चलाएं


एक अनुवर्ती के रूप में, यदि आप एक ही स्कीमा में हटाने की आवश्यकता वाले सभी तालिकाओं को डालते हैं, तो आप इसे कैस्केड के साथ छोड़ सकते हैं: स्कीमा एबीसी कैस्केड को छोड़ दें;
स्कॉट मारलो

ध्यान दें कि यह क्वेरी drop tableकिसी भी अनुक्रम के लिए एक कमांड का उत्पादन करेगी जो इसे पाता है ( relkind = 'S')। drop tableएक अनुक्रम में विफल हो जाएगा। इसके बजाय, खंड 'S'से निकालें relkind IN। यदि आपको दृश्यों को छोड़ने की जरूरत है, तो निरंतर डेटा के साथ एक समान क्वेरी का निर्माण करें select 'drop sequence', इस बारc.relkind = 'S'
mrjmh

9

प्रकटीकरण: यह उत्तर लिनक्स उपयोगकर्ताओं के लिए है।

मैं कुछ और विशिष्ट निर्देश जोड़ूंगा जो @prongs ने कहा:

  • \dtवाइल्डकार्ड का समर्थन कर सकते हैं: इसलिए आप \dt myPrefix*उदाहरण के लिए चला सकते हैं , केवल उन तालिकाओं का चयन करने के लिए जिन्हें आप छोड़ना चाहते हैं;
  • पाठ की प्रतिलिपि बनाने के CTRL-SHIFT-DRAGलिए चयन करने के बाद CTRL-SHIFT-C;
  • में vim, के साथ जाने के लिए INSERT MODEऔर तालिकाओं के साथ पेस्ट CTRL-SHIFT-V;
  • प्रेस करें ESC, फिर :%s/[ ]*\n/, /gइसे कॉमा से अलग की गई सूची में अनुवाद करने के लिए चलाएं , फिर आप इसे पेस्ट कर सकते हैं (अंतिम अल्पविराम को छोड़कर) DROP TABLE % CASCADE

3

लिनक्स कमांड लाइन टूल्स का उपयोग करके, इसे इस तरह से किया जा सकता है:

psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"

नोट: अंतिम गूंज वहाँ है क्योंकि मुझे ड्रॉप कमांड के चारों ओर उद्धरण लगाने का एक तरीका नहीं मिल रहा है, इसलिए आपको आउटपुट को कॉपी और पेस्ट करने की आवश्यकता है और खुद को उद्धरण जोड़ें।

अगर कोई भी उस मामूली मुद्दे को ठीक कर सकता है, तो वह भयानक सॉस होगा।


1

इसलिए मुझे आज इस समस्या का सामना करना पड़ा। मैंने अपना सर्वर db pgadmin3 के माध्यम से लोड किया और इसे इस तरह किया। टेबल्स को वर्णानुक्रम में सॉर्ट किया जाता है ताकि शिफ्ट और क्लिक के बाद डिलीट का काम अच्छी तरह से हो सके।


आप ऐसा कर सकते हैं लेकिन आपको 'गुण' विंडो
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.