sql >> Database >  >> RDS >> PostgreSQL

Vervang alle tabellen van een database behalve één, met gegevens uit een andere db

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.




  1. MySQL - Entiteit:de waarde voor kolom 'IsPrimaryKey' in tabel 'TableDetails' is DBNull

  2. Bij het opslaan van een datetime in sql-server (datetime-type), in welk formaat wordt het dan opgeslagen?

  3. Hoe objecten in een array in een json- of jsonb-waarde te sorteren op een eigenschap van de objecten?

  4. PostgreSQL:de veelzijdige INSERT