sql >> Database teknologi >  >> RDS >> PostgreSQL

Erstat alle tabeller i en database undtagen én med data fra en anden db

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.




  1. Vælg databasenavnet i iSQL plus

  2. UPDATE-sætning for at gentildele en kolonneværdi i henhold til en numerisk formel

  3. MySQL simple select-forespørgsel er langsom

  4. Forøg tabel-id-felt med bitvis optælling