PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como derrubar muitas (mas não todas) mesas de uma só vez?


Em primeiro lugar, você pode excluir muitas tabelas em um único declaração :
DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3 CASCADE;

Em seguida, você pode colocar todas essas tabelas em um esquema separado . Adicione esse esquema ao padrão search_path do(s) seu(s) usuário(s), então tudo é transparente.

Então tudo que você precisa é:
DROP SCHEMA foo CASCADE;

Se isso não for curto o suficiente, crie uma função que execute o comando.
Uma função SQL estática :
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;

Ou uma função PL/pgSQL dinâmica :
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;

Ligar:
SELECT f_delete12();

Para uma declaração ainda mais dinâmica:
Como descarto todas as tabelas no psql (terminal interativo PostgreSQL) que começam com uma palavra comum?