暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 15 preview - 支持 MERGE INTO 语法

原创 digoal 2022-01-20
2008

作者

digoal

日期

2022-03-29

标签

PostgreSQL , merge into


PG 早前已经支持了insert into on conflict ...语法, merge into 也在PostgreSQL 15支持了.

https://www.postgresql.org/docs/devel/sql-merge.html

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=7103ebb7aae8ab8076b7e85f335ceb8fe799097c

Add support for MERGE SQL command  
author  Alvaro Herrera <alvherre@alvh.no-ip.org>      
Mon, 28 Mar 2022 14:45:58 +0000 (16:45 +0200)  
committer   Alvaro Herrera <alvherre@alvh.no-ip.org>      
Mon, 28 Mar 2022 14:47:48 +0000 (16:47 +0200)  
commit  7103ebb7aae8ab8076b7e85f335ceb8fe799097c  
tree    0bc2faf176b58d2546de40c3c36d93a4cdf1aafe    tree  
parent  ae63017bdb316b16a9f201b10f1221598111d6c5    commit | diff  
Add support for MERGE SQL command  
MERGE performs actions that modify rows in the target table using a  
source table or query. MERGE provides a single SQL statement that can  
conditionally INSERT/UPDATE/DELETE rows -- a task that would otherwise  
require multiple PL statements.  For example,  
MERGE INTO target AS t  
USING source AS s  
ON t.tid = s.sid  
WHEN MATCHED AND t.balance > s.delta THEN  
  UPDATE SET balance = t.balance - s.delta  
WHEN MATCHED THEN  
  DELETE  
WHEN NOT MATCHED AND s.delta > 0 THEN  
  INSERT VALUES (s.sid, s.delta)  
WHEN NOT MATCHED THEN  
  DO NOTHING;  
MERGE works with regular tables, partitioned tables and inheritance  
hierarchies, including column and row security enforcement, as well as  
support for row and statement triggers and transition tables therein.  
MERGE is optimized for OLTP and is parameterizable, though also useful  
for large scale ETL/ELT. MERGE is not intended to be used in preference  
to existing single SQL commands for INSERT, UPDATE or DELETE since there  
is some overhead.  MERGE can be used from PL/pgSQL.  
MERGE does not support targetting updatable views or foreign tables, and  
RETURNING clauses are not allowed either.  These limitations are likely  
fixable with sufficient effort.  Rewrite rules are also not supported,  
but it's not clear that we'd want to support them.  
Author: Pavan Deolasee <pavan.deolasee@gmail.com>  
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>  
Author: Amit Langote <amitlangote09@gmail.com>  
Author: Simon Riggs <simon.riggs@enterprisedb.com>  
Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>  
Reviewed-by: Andres Freund <andres@anarazel.de> (earlier versions)  
Reviewed-by: Peter Geoghegan <pg@bowt.ie> (earlier versions)  
Reviewed-by: Robert Haas <robertmhaas@gmail.com> (earlier versions)  
Reviewed-by: Japin Li <japinli@hotmail.com>  
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>  
Reviewed-by: Tomas Vondra <tomas.vondra@enterprisedb.com>  
Reviewed-by: Zhihong Yu <zyu@yugabyte.com>  
Discussion: https://postgr.es/m/CANP8+jKitBSrB7oTgT9CY2i1ObfOt36z0XMraQc+Xrz8QB0nXA@mail.gmail.com  
Discussion: https://postgr.es/m/CAH2-WzkJdBuxj9PO=2QaO9-3h3xGbQPZ34kJH=HukRekwM-GZg@mail.gmail.com  
Discussion: https://postgr.es/m/20201231134736.GA25392@alvherre.pgsql  
MERGE  
MERGE — conditionally insert, update, or delete rows of a table  
Synopsis  
[ WITH with_query [, ...] ]  
MERGE INTO target_table_name [ [ AS ] target_alias ]  
USING data_source ON join_condition  
when_clause [...]  
where data_source is  
{ source_table_name | ( source_query ) } [ [ AS ] source_alias ]  
and when_clause is  
{ WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } |  
  WHEN NOT MATCHED [ AND condition ] THEN { merge_insert | DO NOTHING } }  
and merge_insert is  
INSERT [( column_name [, ...] )]  
[ OVERRIDING { SYSTEM | USER } VALUE ]  
{ VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES }  
and merge_update is  
UPDATE SET { column_name = { expression | DEFAULT } |  
             ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]  
and merge_delete is  
DELETE  

例子:

https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/test/regress/expected/merge.out;h=da8796986ff16b00546398fcb016c1b9e557abb9;hb=7103ebb7aae8ab8076b7e85f335ceb8fe799097c

期望 PostgreSQL 增加什么功能?

PolarDB for PostgreSQL云原生分布式开源数据库

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论