sql >> データベース >  >> RDS >> PostgreSQL

1つを除くデータベースのすべてのテーブルを、別のデータベースのデータに置き換えます

    1つのテーブルをバックアップするには、 COPY> データベース内から:

    COPY user_tbl TO '/path/to/file';
    

    または pg_dump シェルから:

    pg_dump -t user_tbl mydb > user_tbl.sql
    

    次に、データベースを削除し、新しいバージョンを復元して、 user_tblを空にします。 COPY FROMを使用します 1つのテーブルを復元するには:

    COPY user_tbl FROM  '/path/to/file';
    

    または、 を使用して、シェルから1つのテーブルでバックアップを復元します。 psql

    psql -f user_tbl.sql mydb
    

    依存するテーブルを特定する

    速くて汚い

    「COPY...CASCADE」のようなものはありません。依存するテーブルを識別する最も簡単な方法は、トランザクションを開始し、 TRUNCATE tbl CASCADEを呼び出すことです。 受け取った通知を記録します:

    BEGIN;
    TRUNCATE user_tbl CASCADE;
    
    NOTICE:  truncate cascades to table "tbl1"
    NOTICE:  truncate cascades to table "tbl2"
    NOTICE:  truncate cascades to table "tbl3"
    

    次に、トランザクションをロールバックします。実際には何も変更されません。

    ROLLBACK;
    

    それに注意してください。 COMMITの場合 切り捨てが行われます。

    ゆっくりと確実

    まあ、実際には「遅い」わけではありませんが、コードははるかに複雑です。ただし、これは関連するテーブルを排他的にロックするわけではないため、はるかにクリーンで安全です:

    WITH RECURSIVE x AS (
        SELECT conrelid::regclass
        FROM   pg_constraint
        WHERE  confrelid = 'user_tbl'::regclass
    
        UNION
        SELECT p.conrelid::regclass
        FROM   x
        JOIN   pg_constraint p ON p.confrelid = x.conrelid
        )
    SELECT conrelid::text AS tbl
    FROM   x;
    

    返品:

    tbl
    ------
    tbl1
    tbl2
    tbl3
    

    再帰CTEを使用しています (PostgreSQL 8.4以降が必要)カタログテーブル pg_constraint 、各テーブルは順番に依存関係を持つことができるためです。
    UNIONを使用します 、 UNION ALLではありません 複数の外部キーに直接または間接的にリンクされている可能性のあるテーブルの複数の評価を回避するため。




    1. './mysql/user.MYD'が見つかりません(エラーコード:2-そのようなファイルまたはディレクトリはありません)

    2. ビッグデータをPostgreSQLからAWSs3にエクスポートする

    3. MySQL .frmからデータを復元する方法は?

    4. PLS-00103動的SQLを使用した外部テーブルの作成