PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eliminare molti (ma non tutti) tavoli in un colpo solo?

Prima di tutto, puoi eliminare molte tabelle in un singolo dichiarazione :

DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3 CASCADE;

Successivamente, puoi inserire tutte quelle tabelle in uno schema separato . Aggiungi quello schema al search_path dei tuoi utenti, quindi è tutto trasparente.

Allora tutto ciò di cui hai bisogno è:

DROP SCHEMA foo CASCADE;

Se non è abbastanza breve, crea una funzione che esegua il comando.
Una funzione SQL statica :

CREATE OR REPLACE FUNCTION f_delete12()  RETURNS void AS
$func$
DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3, ... CASCADE;
$func$  LANGUAGE sql VOLATILE;

O una funzione dinamica PL/pgSQL :

CREATE OR REPLACE FUNCTION f_delete12()
  RETURNS void AS
$func$
BEGIN
EXECUTE (
   SELECT 'DROP TABLE ' || string_agg('mystuff_table_' || g, ', ')
          || ' CASCADE'
   FROM generate_series(1,12) g  -- numbers 1 to 12
   );
END
$func$  LANGUAGE plpgsql VOLATILE;

Chiama:

SELECT f_delete12();

Per una dichiarazione ancora più dinamica:
Come faccio a eliminare tutte le tabelle in psql (terminale interattivo PostgreSQL) che iniziano con una parola comune?