我需要将两个数据库(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
我怎样才能做到这一点?
答案 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>
这是我合并两个数据库d1
和d2
所遵循的近似顺序,每个数据库都有一个表example
:
将d1
和d2
转储到相应的文件d1.sql.gz
和d2.sql.gz
。这是我用来转储的命令:
$ pg_dump --no-owner | gzip > d1.sql.gz
在本地PostgreSQL服务器上创建一个新的空数据库。
d1.sql.gz
。使用:
迁移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)
记录打印的值(本例中为4)。这将是下一个序列的开始。
d1-new.sql.gz
。使用d2.sql.gz
重复步骤2到4,但使用步骤5中的值作为migrate_pkey_sequence()
的参数:
# SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4);
转储到文件d2-new-without-schema.sql.gz
而不保存架构并禁用触发器。这是我使用的命令:
$ pg_dump --no-owner --data-only --disable-triggers | \
gzip > d2-new-without-schema.sql.gz
创建一个新的空数据库。
按顺序加载d1-new.sql.gz
和d2-new-without-schema.sql.gz
。如果一切按预期工作,主键应该是不相交的而不是冲突。
如果要将数据库加载到远程服务器,请转储数据库。
答案 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