Gebruik COPY
vanuit de database:
COPY user_tbl TO '/path/to/file';
of pg_dump
uit de schaal:
pg_dump -t user_tbl mydb > user_tbl.sql
Laat vervolgens de database vallen, herstel uw nieuwe versie, leeg user_tbl
en gebruik KOPIREN VAN
om die ene tafel te herstellen:
COPY user_tbl FROM '/path/to/file';
of herstel de back-up met de ene tabel uit de shell met psql
:
psql -f user_tbl.sql mydb
Identificeer afhankelijke tabellen
Snel en vuil
Er bestaat niet zoiets als "KOPIE ... CASCADE". De eenvoudigste methode om afhankelijke tabellen te identificeren, is door een transactie te starten, TRUNCATE tbl CASCADE
aan te roepen. en noteer de meldingen die u krijgt:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Draai vervolgens de transactie terug - zodat er feitelijk niets verandert:
ROLLBACK;
Voorzichtig daarmee. Als je COMMIT
de afknotting gaat door.
Langzaam en zeker
Nou ja, eigenlijk niet "traag", maar de code is een stuk complexer. Dit vereist echter geen exclusief slot op de betrokken tafels, dus het is een stuk schoner en veiliger:
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;
Retourneren:
tbl
------
tbl1
tbl2
tbl3
Ik gebruik een recursieve CTE
(vereist PostgreSQL 8.4 of hoger) in de catalogustabel pg_constraint
, omdat elke tabel op zijn beurt afhankelijkheden kan hebben.
Gebruik UNION
, niet UNION ALL
om meerdere evaluaties van tabellen te vermijden die direct of indirect aan meerdere externe sleutels kunnen zijn gekoppeld.