Postgresql: объединить 2 аналогичные базы данных - PullRequest
8 голосов
/ 29 февраля 2012

У меня есть требование объединить две базы данных (Database1 и Database2) в общую базу данных в Postgresql.

Database1

Table1

Id - значение (Id - первичный ключ)

1 - a
2 - aa
3 - aaa
4 - aaaa

База данных2

Таблица1

Значение Id (Id - первичный ключ)

2 - bb
5 - bbbbb

Я хочу, чтобы мой вывод был

OutPutDatabase

Table1

Значение Id (Id - первичный ключ)

1 - a
2 - bb
3 - ааа
4 - аааа
5 - bbbbb

Как мне этого добиться?

Ответы [ 3 ]

7 голосов
/ 29 февраля 2012

Сначала загрузите таблицы в две отдельные схемы в одной и той же базе данных.

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

Затем вы можете объединить их, отдав приоритет db2 над 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;
3 голосов
/ 29 февраля 2012

Не моя идея, а та, которую я читал в прошлом.

Источник: Переместить таблицу в новую базу данных

pg_dump -d db1 -t table1 |psql db2

then psql and do

insert into table2 (select * from table1);
0 голосов
/ 06 июля 2016

Я использовал функцию migrate_pkey_sequence(), определенную здесь , чтобы перенести первичные ключи нескольких таблиц (с одинаковой схемой, но разными значениями из разных баз данных) в разные диапазоны, чтобы я мог объединить таблицы.

Это примерная последовательность, которой я следовал для объединения двух баз данных, d1 и d2, каждая из которых имеет таблицу example:

  1. Дамп d1 и d2 к соответствующим файлам d1.sql.gz и d2.sql.gz.Это команда, которую я использовал для дампа:

    $ pg_dump --no-owner | gzip > d1.sql.gz
    
  2. Создать новую пустую базу данных на локальном сервере PostgreSQL.

  3. Загрузить d1.sql.gz.
  4. Миграция d1.example с использованием:

    # 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. Запишите напечатанное значение (4 в этом примере).Это будет начало следующей последовательности.

  6. Создать дамп в файл d1-new.sql.gz так же, как описано выше.
  7. Повторите шаги 2–4 с d2.sql.gz но используйте значение из шага 5 в качестве аргумента для migrate_pkey_sequence():

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4);
    
  8. Дамп в файл d2-new-without-schema.sql.gz без сохранения схемы и отключения триггеров.Я использовал эту команду:

    $ pg_dump --no-owner --data-only --disable-triggers | \
      gzip > d2-new-without-schema.sql.gz
    
  9. Создайте новую пустую базу данных.

  10. Загрузка d1-new.sql.gz и d2-new-without-schema.sql.gz inпорядок.Если все работает должным образом, первичные ключи должны быть непересекающимися и не конфликтовать.

  11. Дамп базы данных, если вы хотите загрузить ее на удаленный сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...