PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ganti semua tabel database kecuali satu, dengan data dari db lain

Untuk mencadangkan satu tabel saja, gunakan COPY dari dalam basis data:

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

atau pg_dump dari cangkang:

pg_dump -t user_tbl mydb > user_tbl.sql

Kemudian jatuhkan database, pulihkan versi baru Anda, kosongkan user_tbl dan gunakan COPY FROM untuk mengembalikan satu tabel:

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

atau pulihkan cadangan dengan satu tabel dari shell dengan psql :

psql -f user_tbl.sql mydb

Identifikasi tabel bergantung

Cepat dan kotor

Tidak ada yang namanya "COPY ... CASCADE". Metode paling sederhana untuk mengidentifikasi tabel dependen adalah dengan memulai transaksi, panggil TRUNCATE tbl CASCADE dan catat pemberitahuan yang Anda dapatkan:

BEGIN;
TRUNCATE user_tbl CASCADE;

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

Kemudian putar kembali transaksi - jadi tidak ada yang benar-benar berubah:

ROLLBACK;

Hati-hati dengan itu. Jika Anda COMMIT terpotong melewati.

Lambat dan pasti

Yah, sebenarnya tidak "lambat", tetapi kodenya jauh lebih kompleks. Ini tidak mengambil kunci eksklusif pada tabel yang terlibat, jadi jauh lebih bersih dan lebih aman:

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;

Pengembalian:

tbl
------
tbl1
tbl2
tbl3

Saya menggunakan CTE rekursif (memerlukan PostgreSQL 8.4 atau yang lebih baru) pada tabel katalog pg_constraint , karena setiap tabel dapat memiliki ketergantungan secara bergantian.
Gunakan UNION , bukan UNION ALL untuk menghindari beberapa evaluasi tabel yang mungkin ditautkan dengan beberapa kunci asing secara langsung atau tidak langsung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tetapkan id yang sama ke baris dengan kombinasi data yang sama

  2. Kesalahan Koneksi saat menghubungkan ke PostgreSQL sebagai pengguna postgres?

  3. Perbarui tabel dan tampilkan baris yang diperbarui dengan satu perintah SQL

  4. Melihat database di heroku

  5. Batasan nama kolom tabel Postgres?