データベースからすべてのデータを削除して構造(テーブル、リレーションシップなど)を維持する簡単な方法を探しています。私はpostgreSQLを使用していますが、それを行うコマンドがある場合、それはpostgresに固有のものではないと思います。
おかげで、
ダミアン
pg_dump
を使用してスキーマをダンプします。データベースを削除して再作成し、スキーマをロードします。
データベーススキーマ(-sタグ)をファイルにダンプします。
pg_dump -s -f db.dump DB-NAME
データベースを削除します。
dropdb DB-NAME
それを作り直してください:
createdb DB-NAME
スキーマのみを復元します。
pg_restore db.dump > psql DB-NAME
これはPostgreSQLで動作するはずです。他のDBMSには、そのための独自のツールがある場合があります。私はそれを行うための一般的なツールを知りません。
編集:
コメントに続いて、dropdb
コマンドをスキップし、ダンプされたスキーマを使用して別のデータベースを作成することができます。すべてがうまくいった場合は、古いデータベースを削除できます。
pg_dump -s -f db.dump DB-NAME
createdb DB-NEW-NAME
pg_restore db.dump > psql DB-NEW-NAME
この時点で、DB-NAMEに完全なデータベースがあり、DB-NEW-NAMEに空のスキーマがあります。すべて問題ないことを確認したら、dropdb DB-NAME
を使用します。
あなたはこのようなことをすることができます:
export PGUSER=your_pg_user
export PGHOST=database.Host
export PGPORT=port
export PGDATABASE=your_database
psql -qAtX -c "select 'TRUNCATE table ' || quote_ident(table_schema) || '.' || quote_ident(table_name) || ' CASCADE;' from information_schema.tables where table_type = 'BASE TABLE' and not table_schema ~ '^(information_schema|pg_.*)$'" | psql -qAtX
必要なことを行います。
もちろん、これらのエクスポートは必須ではありませんが、標準の-U、-dなどのスイッチをすべて指定しなくても、psqlの2つのコピーを簡単に実行できます。
ただし、TRUNCATEを使用すると、DELETEよりも高速ですが、たとえば、スローバックが発生します。たとえば、Slonyやトリガーで動作する他のレプリケーションシステムによってレプリケートされません。 PostgreSQL 8.4を使用していて、レプリケーションがTRUNCATEでトリガーを使用する方法を知っている場合を除きます。
私はPostgresの人ではありませんが、1つのオプションはテーブルを反復処理し、それぞれに対して Truncate コマンドを発行することです。ただし、不快な関係を考慮する必要があります。たとえば、参照データを参照するデータの前に参照データを削除することはできません。
PgAdminでできること: