web-dev-qa-db-ja.com

SQLデータベースを空にする方法は?

データベースからすべてのデータを削除して構造(テーブル、リレーションシップなど)を維持する簡単な方法を探しています。私はpostgreSQLを使用していますが、それを行うコマンドがある場合、それはpostgresに固有のものではないと思います。

おかげで、

ダミアン

18
Damien

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を使用します。

30
Adam Matan

あなたはこのようなことをすることができます:

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でトリガーを使用する方法を知っている場合を除きます。

6
user80168

私はPostgresの人ではありませんが、1つのオプションはテーブルを反復処理し、それぞれに対して Truncate コマンドを発行することです。ただし、不快な関係を考慮する必要があります。たとえば、参照データを参照するデータの前に参照データを削除することはできません。

2
ZombieSheep

PgAdminでできること:

  • データベースを右クリック->バックアップ、「スキーマのみ」を選択
  • データベースを削除する
  • 新しいデータベースを作成し、前者のように名前を付けます
  • 新しいデータベースを右クリック->復元->バックアップを選択し、「スキーマのみ」を選択します
1
mYnDstrEAm