2010-11-17 14 views

risposta

91

Utilizzare un elenco separato da virgole:

DROP TABLE foo, bar, baz; 

Se avete davvero bisogno di un footgun, questo farà il suo lavoro:

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

Grazie per aver risposto! Un elenco separato da virgole è ottimo per eliminare un piccolo elenco di tabelle. Tuttavia, non è pratico per far cadere 20 tabelle contemporaneamente (o più). Riformulerò la domanda per essere più chiara. –

+1

Siamo spiacenti, questa è l'unica opzione che hai. Potresti costruire una funzione memorizzata per questo, ma ci sono buone possibilità che ti sparerai ai piedi: far cadere troppi tavoli ... –

+2

Funzione aggiunta, buon divertimento! E fai attenzione, questo potrebbe distruggere l'intero database. –

5

ho sempre sentito molto più confortevole la creazione di uno script SQL Posso rivedere e testare prima di eseguirlo piuttosto che fare affidamento sul fatto che il plpgsql sia corretto, in modo da non spazzare via il mio database. Qualcosa di semplice in bash che seleziona il nome della tabella dal catalogo, quindi crea le istruzioni di rilascio per me. Quindi per 8.4.x otterresti questa query di base:

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); 

A cui è possibile aggiungere una clausola where. (Dove c.relname ilike 'Bubba%')

uscita si presenta così:

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

Quindi, salvo che in un file sql ed eseguirlo con psql -f filename.sql

+0

Come follow-up, se si inseriscono tutte le tabelle che devono essere eliminate nello stesso schema, è possibile rilasciarlo con cascata: drop schema abc cascade; –

+0

Si noti che questa query produrrà anche un comando 'drop table' per qualsiasi sequenza trovata (' relkind = 'S''). 'drop table' su una sequenza fallirà. Invece, rimuovi ''S'' dalla clausola' relkind IN'. Se hai bisogno di eliminare sequenze, costruisci una query simile con dati costanti 'seleziona 'drop sequence'', questa volta con' c.relkind =' S'' – mrjmh

24

Ecco un'altra risposta hacker a questo problema. Funziona in ubuntu e forse anche in altri sistemi operativi. fare un \dt nel prompt dei comandi postgres (il prompt dei comandi era in esecuzione all'interno di genome-terminal nel mio caso). Poi vedrai molti tavoli nel terminale. Ora utilizzare la funzionalità ctrl+click-drag di genome-terminal per copiare tutti i nomi di tabelle. enter image description here Apri python, fai un po 'di elaborazione delle stringhe (sostituisci' 'by' 'e poi' \ n 'di', ') e ottieni l'elenco separato da virgola di tutte le tabelle. Ora nella shell di psql fai un drop table CTRL+SHIFT+V e il gioco è fatto. So che è troppo specifico Volevo solo condividere. :)

+0

Funziona alla grande, ti permette di essere facilmente esplicito su ciò che vuoi fare. –

+4

Quello che faccio è simile, scrivo: 'DROP TABLE whatever_' e quindi premere TAB, copiare tutte le tabelle negli appunti, aprire sublime, Trova/Sostituisci, e sostituire usando le espressioni regolari,' '\ s +' 'per' ' , '' e incolla sul terminale. –

6

Divulgazione: questa risposta è pensata per gli utenti Linux.

vorrei aggiungere alcune istruzioni più specifiche per ciò che @prongs detto:

  • \dt in grado di supportare i caratteri jolly: in modo da poter eseguire \dt myPrefix* per esempio, per selezionare solo le tabelle che si desidera eliminare;
  • dopo CTRL-SHIFT-DRAG per selezionare quindi CTRL-SHIFT-C per copiare il testo;
  • in vim, passare a INSERT MODE e incollare le tabelle con CTRL-SHIFT-V;
  • premere ESC, quindi eseguire :%s/[ ]*\n/, /g per convertirlo in elenco separato da virgole, quindi è possibile incollarlo (esclusa l'ultima virgola) in DROP TABLE % CASCADE.
0

Utilizzo degli strumenti della riga di comando di Linux, si può fare in questo modo:

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 {};" 

NOTA: L'ultima eco è lì perché non riuscivo a trovare un modo per mettere le virgolette attorno al comando goccia, quindi è necessario copiare e incollare l'output e aggiungere le citazioni da soli.

Se qualcuno può risolvere quel problema minore, sarebbe una salsa fantastica.

1

Quindi ho affrontato questo problema oggi. Ho caricato il mio server db attraverso pgadmin3 e l'ho fatto in questo modo. Le tabelle sono ordinate alfabeticamente in modo che lo spostamento e il clic seguiti dall'eliminazione funzionino correttamente.

+0

Puoi farlo ma devi usare la finestra 'Proprietà' – Matt

5

Ho usato questo.

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