For blot at tage backup af den ene tabel, brug COPY
inde fra databasen:
COPY user_tbl TO '/path/to/file';
eller pg_dump
fra skallen:
pg_dump -t user_tbl mydb > user_tbl.sql
Slip derefter databasen, gendan din nye version, tøm user_tbl
og brug COPY FROM
for at gendanne den ene tabel:
COPY user_tbl FROM '/path/to/file';
eller gendan sikkerhedskopien med den ene tabel fra shellen med psql
:
psql -f user_tbl.sql mydb
Identificer afhængige tabeller
Hurtig og beskidt
Der er ikke noget, der hedder "COPY ... CASCADE". Den enkleste metode til at identificere afhængige tabeller ville være at starte en transaktion, kalde TRUNCATE tbl CASCADE
og noter de meddelelser, du får:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Rul derefter transaktionen tilbage - så intet faktisk ændrer sig:
ROLLBACK;
Forsigtig med det. Hvis du COMMIT
trunkeringen går igennem.
Langsomt og sikkert
Nå, faktisk ikke "langsom", men koden er meget mere kompleks. Dette kræver dog ikke en eksklusiv lås på de involverede borde, så det er meget renere og sikrere:
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;
Returnerer:
tbl
------
tbl1
tbl2
tbl3
Jeg bruger en rekursiv CTE
(kræver PostgreSQL 8.4 eller nyere) på katalogtabellen pg_constraint
, fordi hver tabel kan have afhængigheder på skift.
Brug UNION
, ikke UNION ALL
for at undgå flere evalueringer af tabeller, der kan være forbundet med flere fremmednøgler direkte eller indirekte.