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.