2010-08-19 3 views

ответ

7

это можно либо удалить все строки из всех таблиц с помощью одной команды в Postgres

Вы правы, ответ НИКАКОГО

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

если нет - ничего себе.

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

С другой мыслью: чего вы пытаетесь достичь?

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

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

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

+1

Вы правы, это именно то, что я пытался сделать, и я был расстроен тем, что в postgres не было простого способа быстро очистить данные. Я создам шаблон - спасибо за помощь. – AP257

+0

Как вы, кажется, ожидаете, что оператор типа «УДАЛИТЬ ВСЕ ОТ ВСЕ» мне интересно, почему? Никакой базы данных, которую я знаю, не поддерживает. –

+0

Ну, мне бы очень понравился DELETE CASCADE. В отсутствие этого DELETE all FROM все будет приемлемой заменой. Но не иметь либо немного боли! – AP257

5

Вы можете написать хранимую процедуру, которая отображает все таблицы во всех схемах, а затем 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(); 
+3

+1: [TRUNCATE] (http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html) был бы моим выбором - не поклонником 'DELETE CASCADE', слишком легким, чтобы испортить fat fingping ... –

+0

Решение будет работать только в том случае, если в базе данных нет внешних ключей, которые были бы справедливыми только для очень простой базы данных. Но функция может быть улучшена, чтобы сначала удалить все существующие ограничения, а затем усечь все таблицы. –

+0

Нет, это не так, вот и приходит CASCADE. Просто проверьте это, и вы увидите. http://www.postgresql.org/docs/current/static/sql-truncate.html –

Смежные вопросы