2012-02-29 20 views
7

Ho un requisito per unire due database (Database1 & Database2) in un database comune in Postgresql.Postgresql: Unisci 2 database simili

Database1

Table1

Id - Valore (Id è la chiave primaria)

1 - un
2 - bis
3 - aaa
4 - aaaa

Database2

Table1

Id Valore (Id è la chiave primaria)

2 - bb
5 - bbbbb

Voglio che la mia uscita come

OutPutDatabase

Tabella1

Id Valore (Id è la chiave primaria)

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

Come posso raggiungere questo obiettivo?

+0

Come si decide quale ID deve essere nel database unito: è importante? Ci sono chiavi esterne che fanno riferimento a queste tabelle, e se sì cosa vuoi fare allora? –

risposta

7

Innanzitutto, caricare le tabelle in due schemi separati nello stesso database.

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 

Quindi è possibile unire i due, dando la priorità DB2 su 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

ho usato la funzione migrate_pkey_sequence() definita here migrare le chiavi primarie delle tabelle multiple (con lo stesso schema ma valori diversi da diversi database) a intervalli distinti in modo da poter unire le tabelle.

Questa è la sequenza approssimata ho seguito per unire due database, d1 e d2, ognuno dei quali ha una tabella example:

  1. cassone d1 e d2 alle rispettive file d1.sql.gz e d2.sql.gz.Questo è il comando che ho usato per eseguire il dump:

    $ pg_dump --no-owner | gzip > d1.sql.gz 
    
  2. Creare un nuovo database vuoto su un server PostgreSQL locale.

  3. Carico d1.sql.gz.
  4. Migrazione d1.example utilizzando:

    # 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. Registrare il valore stampato (4 in questo esempio). Quello sarà l'inizio della prossima sequenza.

  6. Eseguire il dump del file d1-new.sql.gz nello stesso modo come sopra.
  7. Ripetere i passaggi da 2 a 4 con d2.sql.gz ma utilizzare il valore dal punto 5 come argomento per migrate_pkey_sequence():

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4); 
    
  8. dump del file d2-new-without-schema.sql.gz senza salvare lo schema e trigger disabilitare. Questo è il comando che ho usato:

    $ pg_dump --no-owner --data-only --disable-triggers | \ 
        gzip > d2-new-without-schema.sql.gz 
    
  9. Creare un nuovo database vuoto.

  10. Carico d1-new.sql.gz e d2-new-without-schema.sql.gz in ordine. Se tutto ha funzionato come previsto, le chiavi primarie dovrebbero essere disgiunte e non in conflitto.

  11. Eseguire il dump del database se si desidera caricarlo in un server remoto.