Postgresql:合并2个类似的数据库

时间:2012-02-29 12:31:20

标签: database postgresql merge

我需要将两个数据库(Database1和Database2)合并到Postgresql中的公共数据库。

数据库1

表1

ID - 值(Id是主键)

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

的Database2

表1

Id值(Id是主键)

2 - bb
5 - bbbbb

我希望输出为

OutPutDatabase

表1

Id值(Id是主键)

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

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:7)

首先,将表加载到同一数据库中的两个单独的模式中。

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 over 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;

答案 1 :(得分:3)

不是我的主意,而是我过去读过的主题。

The source: Move table to new database

pg_dump -d db1 -t table1 |psql db2

then psql and do

insert into table2 (select * from table1);

答案 2 :(得分:0)

我使用migrate_pkey_sequence()函数定义here将多个表的主键(具有相同的模式但来自不同数据库的不同值)迁移到不同的范围,以便我可以合并表。 / p>

这是我合并两个数据库d1d2所遵循的近似顺序,每个数据库都有一个表example

  1. d1d2转储到相应的文件d1.sql.gzd2.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. 使用d2.sql.gz重复步骤2到4,但使用步骤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.gzd2-new-without-schema.sql.gz。如果一切按预期工作,主键应该是不相交的而不是冲突。

  11. 如果要将数据库加载到远程服务器,请转储数据库。

答案 3 :(得分:0)

我已经能够使用pg_dump和pg_restore轻松合并2个postgres数据库。

就我而言,使用UUID标识符很容易,因此没有重复的密钥。

导出(仅数据,不包括某些架构和表):

pg_dump --dbname=database_1 --username=${POSTGRES_USER} --no-owner --format=tar --data-only --exclude-schema=hdb_views --exclude-schema=hdb_catalog --exclude-table=app_configuration --exclude-table=migrations --file=/database_1.data-only.dump

导入(必要时更改角色):

pg_restore --username=$POSTGRES_USER --role=$POSTGRES_USER --no-owner --exit-on-error --verbose --dbname=database_2 /database_1.data-only.dump