PG Merge语法使用

从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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值