2012-02-29 14 views
7

Mam wymóg połączenia dwóch baz danych (Database1 & Database2) do wspólnej bazy danych w Postgresql.Postgresql: Merge 2 podobne bazy danych

Database1

Tabela1

Id - Wartość (Id jest klucz podstawowy)

1 -
2 - aa
3 - aaa
4 - aaaa

Baza danych2

Tabela1

Id Wartość (Id jest klucz podstawowy)

2 - bb
5 - bbbbb

Chcę moje wyjście jako

OutPutDatabase

Tabela1

Id Wartość (Id jest klucz podstawowy)

1 -
2 - bb
3 - aaa
4 - aaaa
5 - bbbbb

W jaki sposób można to osiągnąć?

+0

W jaki sposób decydujesz, jaki powinien być identyfikator w scalonej bazie danych - czy to ma znaczenie? Czy istnieją obce klucze odnoszące się do tych tabel, a jeśli tak, to co chcesz zrobić? –

Odpowiedz

7

Najpierw załaduj tabele na dwa oddzielne schematy w tej samej bazie danych.

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 

Następnie można połączyć dwa, wybierając priorytet db2 przez 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

, że stosuje się funkcję migrate_pkey_sequence() zdefiniowane here migracji klucz podstawowy wielu tabel (z tego samego schematu, ale z różnymi wartościami z różnymi bazami danych) do różnych zakresach, dzięki czemu może scalania tabele.

jest to przybliżona sekwencja że następuje połączenie dwóch baz danych d1 i d2, z których każda znajduje się stół example:

  1. zrzutu d1 i d2 do odpowiednich plików d1.sql.gz i d2.sql.gz.Jest to polecenie kiedyś zrzucić:

    $ pg_dump --no-owner | gzip > d1.sql.gz 
    
  2. Utwórz nową, pustą bazę danych na lokalny serwer PostgreSQL.

  3. Załaduj d1.sql.gz.
  4. migracji d1.example z:

    # 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. rejestruje wartość drukowana (cztery w tym przykładzie). To będzie początek następnej sekwencji.

  6. Zrzuć do pliku d1-new.sql.gz w taki sam sposób jak powyżej.
  7. Powtórz kroki od 2 do 4 z d2.sql.gz ale użyć wartości z kroku 5 jako argumentu do migrate_pkey_sequence():

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4); 
    
  8. Dump do pliku d2-new-without-schema.sql.gz bez zapisywania schematu i wyłączanie wyzwalaczy. To jest polecenie, którego użyłem:

    $ pg_dump --no-owner --data-only --disable-triggers | \ 
        gzip > d2-new-without-schema.sql.gz 
    
  9. Utwórz nową, pustą bazę danych.

  10. Załaduj d1-new.sql.gz i d2-new-without-schema.sql.gz w kolejności. Jeśli wszystko działało zgodnie z oczekiwaniami, klucze podstawowe powinny być rozłączne, a nie konfliktowe.

  11. Zrzuć bazę danych, jeśli chcesz załadować ją do zdalnego serwera.

Powiązane problemy