学习目的
通过MERGE INTO语句,将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,无法匹配时对目标表执行INSERT。此语法可以很方便地用来合并执行UPDATE和INSERT,避免多次执行。
MERGE INTO
是一种用于合并数据的SQL操作。MERGE INTO
语句用于将一张表的数据合并到另一张表中,可以根据指定的条件来判断是执行插入、更新或删除操作
注意事项
• 进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。
• 不支持重分布过程中MERGE INTO。
语法
openGauss=# \h merge
Command: MERGE
Description: insert, update, or delete rows of a table based upon source data
Syntax:
MERGE [/*+ plan_hint */] INTO table_name [ partition_clause ] [ [ AS ] alias ]
USING { { table_name | view_name } | subquery } [ [ AS ] alias ]
ON ( condition )
[
WHEN MATCHED THEN
UPDATE SET { column_name = { expression | subquery | DEFAULT } |
( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...]
[ WHERE condition ]
]
[
WHEN NOT MATCHED THEN
INSERT { DEFAULT VALUES |
[ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }
];
where partition_clause can be:
PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } |
SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) }
NOTICE: 'partition_clause' is only avaliable in CENTRALIZED mode!
NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!
openGauss=#
示例
示例1
create table products(product_id int ,product_name varchar2(60),category varchar2(60));
INSERT INTO products VALUES(1501, 'vivitar 35mm', 'electrncs');
INSERT INTO products VALUES(1502, 'olympus is50', 'electrncs');
INSERT INTO products VALUES(1600, 'play gym', 'toys');
INSERT INTO products VALUES(1601, 'lamaze', 'toys');
INSERT INTO products VALUES(1666, 'harry potter', 'dvd');
结果
hu1=# select * from products;
product_id | product_name | category
------------+--------------+-----------
1501 | vivitar 35mm | electrncs
1502 | olympus is50 | electrncs
1600 | play gym | toys
1601 | lamaze | toys
1666 | harry potter | dvd
(5 rows)
示例2
create table newproducts(product_id int ,product_name varchar2(60),category varchar2(60));
INSERT INTO newproducts VALUES(1502, 'olympus camera', 'electrncs');
INSERT INTO newproducts VALUES(1601, 'lamaze', 'toys');
INSERT INTO newproducts VALUES(1666, 'harry potter', 'toys');
INSERT INTO newproducts VALUES(1700, 'wait interface', 'books');
结果
hu1=# select * from newproducts;
product_id | product_name | category
------------+----------------+-----------
1502 | olympus camera | electrncs
1601 | lamaze | toys
1666 | harry potter | toys
1700 | wait interface | books
(4 rows)
hu1=#
进行MERGE INTO操作
hu1=# MERGE INTO newproducts np USING products p
hu1-# ON(np.product_id = p.product_id)
hu1-# WHEN MATCHED THEN
hu1-# UPDATE SET np.product_name = p.product_name, np.category = p.category
hu1-# WHEN NOT MATCHED THEN
hu1-# INSERT VALUES (p.product_id, p.product_name, p.category) ;
MERGE 5
hu1=#
MERGE INTO newproducts np USING products p ON(np.product_id = p.product_id) WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category WHEN NOT MATCHED THEN INSERT VALUES (p.product_id, p.product_name, p.category) ;
查看结果
hu1=# select * from newproducts;
product_id | product_name | category
------------+----------------+-----------
1700 | wait interface | books
1501 | vivitar 35mm | electrncs
1502 | olympus is50 | electrncs
1600 | play gym | toys
1601 | lamaze | toys
1666 | harry potter | dvd
(6 rows)
hu1=#
hu1=# select * from products;
product_id | product_name | category
------------+--------------+-----------
1501 | vivitar 35mm | electrncs
1502 | olympus is50 | electrncs
1600 | play gym | toys
1601 | lamaze | toys
1666 | harry potter | dvd
(5 rows)
hu1=#
建立数据库兼容列表
Command: CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE [ IF NOT EXISTS ] database_name
[ [ WITH ] {[ OWNER [=] user_name ]|
[ TEMPLATE [=] template ]|
[ ENCODING [=] encoding ]|
[ LC_COLLATE [=] lc_collate ]|
[ LC_CTYPE [=] lc_ctype ]|
[ DBCOMPATIBILITY [=] compatibility_type ]|
[ TABLESPACE [=] tablespace_name ]|
[ CONNECTION LIMIT [=] connlimit ]}[...] ];
结论
MERGE INTO 后面是操作的表(newproducts),被操作的表(USING products p),把符合条件的products里面的记录同步到newproducts中 MERGE INTO 这个语法源于Oracle,可是国产化的过程中,O的数据库比较多,所以popenGauss也实现这个语法 与MySQL的ON DUPLICATE KEY操作差不多,只是在语法上支持的更多了
以上数据参考互联网的数据,自己造数据太麻烦了,如果有冲突联系我删除
文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




