sql >> Databáze >  >> RDS >> PostgreSQL

Nahraďte všechny tabulky databáze kromě jedné daty z jiné databáze

Chcete-li zálohovat pouze jednu tabulku, použijte COPY z databáze:

COPY user_tbl TO '/path/to/file';

nebo pg_dump ze skořápky:

pg_dump -t user_tbl mydb > user_tbl.sql

Poté databázi zahoďte, obnovte svou novou verzi, vyprázdněte user_tbl a použijte COPY FROM pro obnovení jedné tabulky:

COPY user_tbl FROM  '/path/to/file';

nebo obnovte zálohu pomocí jedné tabulky z prostředí pomocí psql :

psql -f user_tbl.sql mydb

Identifikujte závislé tabulky

Rychlé a špinavé

Neexistuje nic takového jako "KOPÍROVAT ... KASKÁD". Nejjednodušší metodou k identifikaci závislých tabulek by bylo zahájení transakce, volání TRUNCATE tbl CASCADE a zaznamenejte si upozornění, která obdržíte:

BEGIN;
TRUNCATE user_tbl CASCADE;

NOTICE:  truncate cascades to table "tbl1"
NOTICE:  truncate cascades to table "tbl2"
NOTICE:  truncate cascades to table "tbl3"

Poté transakci vraťte zpět – takže se vlastně nic nezmění:

ROLLBACK;

S tím opatrně. Pokud COMMIT zkrácení prochází.

Pomalu a jistě

No, vlastně ne "pomalý", ale kód je mnohem složitější. To však nevyžaduje exkluzivní zámek na příslušných stolech, takže je to mnohem čistší a bezpečnější:

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;

Vrátí:

tbl
------
tbl1
tbl2
tbl3

Používám rekurzivní CTE (vyžaduje PostgreSQL 8.4 nebo novější) v tabulce katalogu pg_constraint , protože každá tabulka může mít postupně závislosti.
Použijte UNION , nikoli UNION ALL abyste se vyhnuli vícenásobnému vyhodnocování tabulek, které by mohly být přímo nebo nepřímo spojeny s více cizími klíči.




  1. Jak zahrnout chybějící data pro více seskupení v časovém rozpětí?

  2. RuntimeError:pracuje mimo kontext aplikace

  3. Seskupit součet ze dvou tabulek podle data v MySQL

  4. Kontingenční dotaz Oracle SQL