Postgres: удалить все таблицы или каскадно удалить? - PullRequest
5 голосов
/ 19 августа 2010

Можно ли удалить все строки из всех таблиц с помощью одной команды в postgres (без уничтожения базы данных), или каскадно удалить в postgres?

Если нет, то как мне сбросить тестовую базу данных?

Ответы [ 2 ]

7 голосов
/ 19 августа 2010

возможно ли удалить все строки из всех таблиц одной командой в postgres

Вы правы, ответ НЕТ

Вы можете определить каскадные внешние ключи, которые будут удалять все ссылочные строки, если удаляется «родительский». Но это атрибут внешнего ключа, вы ничего не можете указать с помощью инструкции DELETE

если нет - вау.

Что это должно означать?

Если подумать: чего вы пытаетесь достичь?

У меня есть подозрение, что вы пытаетесь «перезагрузить», например, тестовая база данных. В этом случае подход PostgreSQL будет выглядеть следующим образом:

  • Создайте базу данных, которая содержит все, что вам нужно (таблицы, представления, индексы и т. Д.), В новой базе данных (например, my_template)
  • Чтобы сбросить текущую тестовую базу данных, выполните DROP DATABASE testdb, а затем заново создайте тестовую базу данных, используя CREATE DATABASE testdb TEMPLATE my_template

Вновь созданная testdb будет иметь все таблицы, определенные в my_template. Это, вероятно, на много быстрее, чем удаление всех строк.

5 голосов
/ 19 августа 2010

Вы можете написать хранимую процедуру, которая выбирает все таблицы во всех схемах и затем выполняет DELETE CASCADE или TRUNCATE для этих таблиц.Это всего лишь несколько строк pl / pgsql-кода, ничего страшного.

Редактировать: Это поможет, но будьте осторожны!:

CREATE OR REPLACE FUNCTION truncate_all() RETURNS void LANGUAGE plpgsql AS
$$
DECLARE
    row record;
    query   text;
BEGIN
    query := 'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN(''pg_catalog'', ''information_schema'') AND table_type = ''BASE TABLE''';

    FOR row IN EXECUTE query LOOP
        EXECUTE 'TRUNCATE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name) || ' CASCADE;';
    END LOOP;

    RETURN;
END;
$$;

-- execute:
SELECT truncate_all();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...