从PostgreSQL15开始支持Merge Into语法,以前版本可以使用insert ... do conflicts语法。
测试过程:
两台机器
源机器 100.138 PostgreSQL 11.5
目标机器 100.51 PostgreSQL 17.4 (编译安装的时候需要把dblink扩展加上)
数据情况如下:图层名字maincity(源和目标结构相同)
结构如下:
\d maincity
数据表 "sde.maincity"
栏位 | 类型 | 校对规则 | 可空的 | 预设
-------------------+-----------------------+----------+----------+------
objectid | integer | | not null |
name | character varying(30) | | |
adclass | smallint | | |
pinyin | character varying(50) | | |
gdb_geomattr_data | bytea | | |
shape | geometry | | |
索引:
"a153_ix1" gist (shape)
"r186_sde_rowid_uk" UNIQUE, btree (objectid) WITH (fillfactor='75')
检查约束限制
"enforce_shape_srid" CHECK (st_srid(shape) = 4326)
1. 记录情况
源机器
select count(*) from maincity;
count
-------
1530
目标机器
select count(*) from maincity ;
count
-------
200
2. 在目标机器上创建dblink,以方便连接到源机器
当然本例子中访问远程数据库使用的是老的dblink,现在更多的使用postgres_fdw,以外部表形势访问也可以的。
select dblink_connect('138_test','host=192.168.100.138 dbname=test port=5432 user=sde password=sde');
dblink_connect
----------------
OK
select dblink_get_connections();
dblink_get_connections
------------------------
{138_test}
dblink的连接信息,是保存在后台进程的TopMemoryContext的remoteConnHash表中的,因此只对当前连接有效。连接推出后,会销毁,下次连接需要重新创建
3. 把objectid小于1200的同步过来
merge into maincity as dst
using dblink('138_test','select * from maincity where objectid<=1200') as src(objectid integer,name varchar(30),adclass smallint,pinyin varchar(50),gdb_geomattr_data bytea,shape geometry)
on(dst.objectid=src.objectid)
when matched then update set name=src.name,adclass=src.adclass,pinyin=src.pinyin,gdb_geomattr_data=src.gdb_geomattr_data,shape=src.shape
when not matched then insert (objectid,name,adclass,pinyin,gdb_geomattr_data,shape) values (src.objectid,src.name,src.adclass,src.pinyin,src.gdb_geomattr_data,src.shape)
MERGE 1200
4. 查询目标机器
select count(*) from maincity ;
count
-------
1200