do
$$
declare
l_stmt text;
begin
select 'truncate ' || string_agg(format('%I.%I', schemaname, tablename), ',')
into l_stmt
from pg_tables
where schemaname in ('public');
execute l_stmt;
end;
$$
これは、スキーマ public 内のすべてのテーブルを1つのステートメントで切り捨てるもので、すべてのテーブルをつなぐ多くの外部キー制約がある場合でも機能します。テーブルが複数のスキーマにまたがっている場合は、where条件に追加する必要があります。
SELECT 'TRUNCATE ' || input_table_name || ' CASCADE;' AS truncate_query FROM(SELECT table_schema || '.' || table_name AS input_table_name FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') AND table_schema NOT LIKE 'pg_toast%') AS information;
データベースを削除する必要はなく、データベース内のすべてのオブジェクトを削除すれば十分です。これは、以下の方法で行うことができます。
その後、
create table
ステートメントを含むSQLダンプを作成すれば(つまり、--data-only
オプションなしで)、すべてがうまくいくはずです。また、
--column-inserts
を削除することで、インポートがlot高速になります。しかし、もしすべてを削除したいのであれば、ちょっとした動的なSQLでそれを行うことができます:
これは、スキーマ
public
内のすべてのテーブルを1つのステートメントで切り捨てるもので、すべてのテーブルをつなぐ多くの外部キー制約がある場合でも機能します。テーブルが複数のスキーマにまたがっている場合は、where
条件に追加する必要があります。pg_restoreには-cleanフラグ(または-createフラグ)があり、操作を実行する前にデータを自動削除します。
優れたドキュメントが大いに役立つはずです...。
ただ、紛らわしいので、はっきりさせておきます:
オブジェクトを再作成する前に、データベースのオブジェクトを削除します。(--if-existsが使用されていない限り、オブジェクトが目的地のデータベースに存在しない場合、これはいくつかの無害なエラーメッセージを生成するかもしれません)。
これは、実際のデータベースを削除するのではなく、テーブル/ビュー/その他を削除します。
もし何らかの理由でテーブルを削除して再作成することができないのであれば、ソースデータベースからデータのみのダンプを作成し、ターゲットデータベースで
TRUNCATE
またはDELETE
を発行し、データダンプをロードするスクリプトを手動作成する必要があります。私が知る限りでは、これを行うための迅速でスムーズな方法はありません。上記のクエリは、データベース内のすべてのテーブルに対してトランケートクエリを生成します。
注:私の答えは、テーブルやその他のデータベースオブジェクトを実際に削除することです。 すべてのデータをテーブルの_に削除する、つまり. Endre Bothは、すべてのテーブルを切り捨て、1か月後に同様に適切に実行された(直接実行)ステートメントを提供しました。
「DROP SCHEMA public CASCADE;」、「DROP OWNED BY current_user;」などだけでは不十分な場合は、トランザクションセーフ(つまり、.
BEGIN;
とROLLBACK;
の間に置いて、テストするか、実際に証書を実行するためにCOMMIT;
を配置することができます。そして、 "すべての"データベースオブジェクトをクリーンアップします...まあ、データベースで使用されているものすべてアプリケーションが使用するか、賢明に追加できます。-テーブルのトリガー。 -テーブルの制約(FK、PK、「CHECK」、「UNIQUE」)。 -インディクス。 -
VIEW
s(通常または具体化)。 -テーブル。 -シーケンス。 -関数/手順(pg_proc.pr oisagg
おそらく名誉を与えられるべき)。 -すべてのn ⁇ n-default(つまり. 「パブリック」またはDB-内部)スキーマ「私たち」は所有していません。スクリプトは、「データベーススーパーユーザーではない」として実行すると便利です。スーパーユーザーは_all_スキーマをドロップできます(ただし、本当に重要なスキーマはまだ明示的に除外されています)。 -拡張機能(ユーザーが貢献していますが、通常は意図的にそのままにしておきます)。落とされないのは(意図的なものもあれば、DBに例がなかったためだけのものもあります):
-'public`スキーマ(例:. それらの拡張提供のもののために)。 -関数を集約します。 -照合やその他のロケールのもの。 -イベントトリガー。 -テキスト検索のもの、 ...(ここを参照してください)。 -役割またはその他のセキュリティ設定。 -複合タイプ。 -トーストテーブル。 -FDWと外部テーブル。
これは、復元したいダンプが別のデータベーススキーマバージョンである場合(たとえば、. Debian
dbconfig-common
、FlywayまたはLiquibase / DB-Manulを使用して)、復元するデータベースよりも。また、誰かが興味を持っている場合に備えて、「2つのテーブルとそのテーブル以外のすべて」を削除するバージョンもあります。差分は小さいです。 必要に応じてご連絡ください。
SQL。
PostgreSQL 9.6(
jessie-backports
)で、後の追加(Clément Pré vostによって寄与されたextensions
)を除いてテストされました。 バグフィックスとさらなる改善を歓迎します。!