2012-02-29 48 views
7

Tôi có yêu cầu sáp nhập hai cơ sở dữ liệu (Database1 & Database2) vào cơ sở dữ liệu chung trong Postgresql.Postgresql: Hợp nhất 2 cơ sở dữ liệu tương tự

Database1

Table1

Id - Giá trị (Id là chìa khóa Primary)

1 - một
2 - aa
3 - aaa
4 - aaaa

Cơ sở dữ liệu2

.210

Table1

Id giá trị (Id là chìa khóa Primary)

2 - bb
5 - bbbbb

Tôi muốn đầu ra của tôi như

OutPutDatabase

Bảng1

Id giá trị (Id là chìa khóa Primary)

1 - một
2 - bb
3 - aaa
4 - aaaa
5 - bbbbb

Làm thế nào tôi có thể đạt được điều này?

+0

Bạn quyết định id nào sẽ ở trong cơ sở dữ liệu đã hợp nhất - có quan trọng không? Có khoá ngoại nào tham khảo những bảng này không, và nếu bạn muốn làm gì thì sao? –

Trả lời

7

Trước tiên, tải các bảng vào hai lược đồ riêng biệt trong cùng một cơ sở dữ liệu.

CREATE SCHEMA db1; 
CREATE TABLE db1.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database1 into db1.table1 

CREATE SCHEMA db2; 
CREATE TABLE db2.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database2 into db2.table1 

Sau đó, bạn có thể hợp nhất hai, bằng cách ưu tiên db2 qua db1.

SELECT 
    DISTINCT ON (id) 
    id, 
    value 
FROM (
    SELECT 
    *, 
    1 AS db 
    FROM 
    db1.table1 

    UNION 

    SELECT 
    *, 
    2 AS db 
    FROM 
    db2.table1) AS mix 
ORDER BY 
    id, 
    db DESC; 
0

tôi đã sử dụng migrate_pkey_sequence() chức năng được xác định here để di chuyển các phím chính của nhiều bảng (với schema tương tự nhưng giá trị khác nhau từ cơ sở dữ liệu khác nhau) để dãy riêng biệt để tôi có thể hợp nhất các bảng.

Đây là chuỗi gần đúng Tôi đi theo để hợp nhất hai cơ sở dữ liệu, d1d2, mỗi trong số đó có một bảng example:

  1. Dump d1d2 để các tập tin tương ứng d1.sql.gzd2.sql.gz.Đây là lệnh tôi đã sử dụng để đổ:

    $ pg_dump --no-owner | gzip > d1.sql.gz 
    
  2. Tạo cơ sở dữ liệu mới, trống trên máy chủ PostgreSQL cục bộ.

  3. Tải d1.sql.gz.
  4. Di chuyển d1.example sử dụng:

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 1); 
    INFO: 00000: UPDATE example SET id = nextval('example_id_seq') + 0 
    INFO: 00000: ALTER SEQUENCE example_id_seq RESTART WITH 1 
    INFO: 00000: UPDATE example SET id = DEFAULT 
    migrate_pkey_sequence 
    ----------------------- 
            4 
    (1 row) 
    
  5. Ghi giá trị in (4 trong ví dụ này). Đó sẽ là khởi đầu của chuỗi tiếp theo.

  6. Dump vào tệp d1-new.sql.gz theo cùng cách như trên.
  7. Lặp lại các bước từ 2 đến 4 với d2.sql.gz nhưng sử dụng giá trị từ bước 5 như là đối số để migrate_pkey_sequence():

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4); 
    
  8. Dump đến tập tin mà không lưu d2-new-without-schema.sql.gz giản đồ và trigger disable. Đây là lệnh tôi đã sử dụng:

    $ pg_dump --no-owner --data-only --disable-triggers | \ 
        gzip > d2-new-without-schema.sql.gz 
    
  9. Tạo cơ sở dữ liệu mới, trống.

  10. Tải d1-new.sql.gzd2-new-without-schema.sql.gz theo thứ tự. Nếu mọi thứ hoạt động như mong đợi, các khóa chính sẽ bị phân tách và không xung đột.

  11. Dump cơ sở dữ liệu nếu bạn muốn tải nó vào máy chủ từ xa.

Các vấn đề liên quan