PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thay thế tất cả các bảng của cơ sở dữ liệu ngoại trừ một bảng, bằng dữ liệu từ một db khác

Để chỉ sao lưu một bảng, hãy sử dụng COPY từ bên trong cơ sở dữ liệu:

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

hoặc pg_dump từ vỏ:

pg_dump -t user_tbl mydb > user_tbl.sql

Sau đó thả cơ sở dữ liệu, khôi phục phiên bản mới của bạn, trống user_tbl và sử dụng COPY FROM để khôi phục một bảng:

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

hoặc khôi phục bản sao lưu bằng một bảng từ shell với psql :

psql -f user_tbl.sql mydb

Xác định các bảng phụ thuộc

Nhanh và bẩn

Không có cái gọi là "SAO CHÉP ... CASCADE". Phương pháp đơn giản nhất để xác định các bảng phụ thuộc sẽ là bắt đầu một giao dịch, gọi TRUNCATE tbl CASCADE và ghi lại các thông báo bạn nhận được:

BEGIN;
TRUNCATE user_tbl CASCADE;

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

Sau đó quay trở lại giao dịch - vì vậy không có gì thực sự thay đổi:

ROLLBACK;

Cẩn thận với điều đó. Nếu bạn COMMIT đường cắt ngắn đi qua.

Chậm và chắc

Chà, không thực sự "chậm", nhưng mã phức tạp hơn rất nhiều. Tuy nhiên, điều này không có một khóa riêng trên các bảng liên quan, vì vậy nó sạch sẽ và an toàn hơn rất nhiều:

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;

Lợi nhuận:

tbl
------
tbl1
tbl2
tbl3

Tôi sử dụng CTE đệ quy (yêu cầu PostgreSQL 8.4 trở lên) trên bảng danh mục pg_constraint , bởi vì mỗi bảng có thể có các phụ thuộc lần lượt.
Sử dụng UNION , không phải UNION ALL để tránh đánh giá nhiều bảng có thể được liên kết với nhiều khóa ngoại trực tiếp hoặc gián tiếp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tổng hợp các hàm trên nhiều bảng đã kết hợp

  2. Django cache.set () gây ra lỗi khóa trùng lặp

  3. Làm thế nào để làm tròn đến X phút gần nhất với PL / pgSQL?

  4. PostgreSql 'PDOException' với thông báo 'không thể tìm thấy trình điều khiển'

  5. postgresql làm cho khóa chính hiện có tự động tăng lên khi chèn