PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ersetzen Sie alle Tabellen einer Datenbank bis auf eine durch Daten aus einer anderen Datenbank

Um nur die eine Tabelle zu sichern, verwenden Sie COPY aus der Datenbank:

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

oder pg_dump aus der Shell:

pg_dump -t user_tbl mydb > user_tbl.sql

Löschen Sie dann die Datenbank, stellen Sie Ihre neue Version wieder her, leeren Sie user_tbl und verwenden Sie COPY FROM um die eine Tabelle wiederherzustellen:

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

oder stellen Sie die Sicherung mit der einen Tabelle aus der Shell mit psql :

psql -f user_tbl.sql mydb

Identifizieren Sie abhängige Tabellen

Schnell und schmutzig

Es gibt kein "COPY ... CASCADE". Die einfachste Methode, abhängige Tabellen zu identifizieren, wäre, eine Transaktion zu starten, TRUNCATE tbl CASCADE aufzurufen und notieren Sie die Benachrichtigungen, die Sie erhalten:

BEGIN;
TRUNCATE user_tbl CASCADE;

NOTICE:  truncate cascades to table "tbl1"
NOTICE:  truncate cascades to table "tbl2"
NOTICE:  truncate cascades to table "tbl3"

Setzen Sie dann die Transaktion zurück - damit sich eigentlich nichts ändert:

ROLLBACK;

Vorsicht damit. Wenn Sie COMMIT das Abschneiden geht durch.

Langsam und sicher

Nun, nicht wirklich "langsam", aber der Code ist viel komplexer. Dies erfordert jedoch keine exklusive Sperre für die beteiligten Tabellen, daher ist es viel sauberer und sicherer:

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;

Rückgabe:

tbl
------
tbl1
tbl2
tbl3

Ich verwende einen rekursiven CTE (erfordert PostgreSQL 8.4 oder höher) in der Katalogtabelle pg_constraint , da jede Tabelle wiederum Abhängigkeiten haben kann.
Verwenden Sie UNION , nicht UNION ALL um Mehrfachauswertungen von Tabellen zu vermeiden, die direkt oder indirekt mit mehreren Fremdschlüsseln verknüpft sein könnten.