Как отбросить многие (но не все) таблицы одним махом?
У меня есть база данных со многими таблицами. Двенадцать из этих таблиц начинаются с того же префикса:
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