INSERT ON CONFLICT
现有一个业务需求:需要根据关联关系,用B表的数据修改A表中的一个字段。
当看到这个需求的时候,我首先想到的是常用的DB中那种UPDATE...JOIN...
的语法。
但是经过测试,发现Hologres不支持MySQL那种UPDATE...JOIN...
的语法,所以只能去查询文档,发现Hologres支持INSERT ON CONFLICT
语法,可以实现类似的功能。
INSERT ON CONFLICT
语句用于在指定列插入某行数据时,如果主键存在重复的行数据,则对该数据执行更新或跳过操作。
使用限制
-
INSERT ON CONFLICT
语句的条件必须包含所有主键。 -
如果系统提示实例版本过低不支持该功能。您可以执行如下命令或提交工单升级实例至最新版本。
set hg_experimental_enable_insert_on_conflict = on;
应用场景
INSERT ON CONFLICT
命令适用于通过SQL方式导入数据的场景。
命令格式
INSERT ON CONFLICT
的语法格式如下。
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
{ VALUES ( { expression } [, ...] ) [, ...] | query }
[ ON CONFLICT [ conflict_target ] conflict_action ]
where conflict_target is pk
ON CONSTRAINT constraint_name
and conflict_action is one of:
DO NOTHING
DO UPDATE SET { column_name = { expression } |
( column_name [, .