Как отбросить многие (но не все) таблицы одним махом?

У меня есть база данных со многими таблицами. Двенадцать из этих таблиц начинаются с того же префикса:

mystuff_table_1
mystuff_table_2
mystuff_table_3
mystuff_table_4
etc...

Я не хочу печатать DROP TABLE mystuff_table_n CASCADE; снова и снова, тем более что мне приходится неоднократно бросать столы. Как я могу сделать мою жизнь проще?

2 ответа

Прежде всего, вы можете удалить много таблиц в одном выражении:

DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3 CASCADE;

Затем вы можете поместить все эти таблицы в отдельную схему. Добавьте эту схему к умолчанию search_path ваших пользователей, так что все прозрачно.

Тогда все, что вам нужно, это:

DROP SCHEMA foo CASCADE;

Если этого недостаточно, создайте функцию, которая выполняет команду.
Статическая функция SQL:

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;

Или динамическая функция 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;

Вызов:

SELECT f_delete12();

Для еще более динамичного утверждения:
Как удалить все таблицы в psql (интерактивный терминал PostgreSQL), который начинается с общего слова?

Вы можете создать процедуру, чтобы сделать это автоматически:

Пытаться:

CREATE OR REPLACE FUNCTION public.p_drop_tables (
  p_start integer,
  p_end integer,
  p_table varchar
)
RETURNS void AS
$body$
DECLARE SQL VARCHAR := '';
BEGIN

FOR i IN p_start..p_end LOOP

SQL := 'DROP TABLE public.' || p_table || i || ';';

--RAISE NOTICE '%',SQL;

EXECUTE (SQL);

END LOOP; 

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

Att

Другие вопросы по тегам