PostgreSQL 的 upsert介绍及语法
PostgreSQL 的 upsert 功能:当记录不存在时,执行插入;否则,进行更新。
注意: ON CONFLICT
只在 PostgreSQL 9.5 以上可用。
INSERT INTO table_name(column_list) VALUES(value_list)
ON CONFLICT target action;
target 可以是:
- (column_name):一个字段名
- ON CONSTRAINT constraint_name:其中的 constraint_name 可以是一个唯一约束的名字
- WHERE predicate:带谓语的 WHERE 子句
action 可以是:
- DO NOTHING:当记录存在时,什么都不做
- DO UPDATE SET column_1 = value_1, … WHERE condition:当记录存在 时,更新表中的一些字段
实际操作
建表导入模拟数据
drop table if exists "test"."goods";
create table "test"."goods" (
"store_cd" int4 not null,
"good_cd" varchar(50) not null,
"name" varchar(255)
);
alter table "test"."goods" add constraint "pr_cd_key" primary key ("store_cd", "good_cd");
insert into "test"."goods" values (101, '1', '张三');
insert into "test"."goods" values (102, '2', '李四');
insert into "test"."goods" values (103, '3', '王五');
select * from "test"."goods";
数据存在则更新数据,不存在则插入数据
通过指定约束名称进行upsert
insert into test.goods values ( 104, '4', '赵六' )
on conflict on constraint pr_cd_key do
update
set name = '更新'
where
goods.store_cd = '104'
and goods.good_cd = '4'
;
通过指定唯一键字段进行upsert
insert into test.goods values ( 104, '4', '赵六' )
on conflict ( store_cd, good_cd ) do
update
set name = '更新'
where
goods.store_cd = '104'
and goods.good_cd = '4'
;
数据存在即不做任何操作,数据不存在则插入
insert into test.goods values ( 104, '4', '赵六' )
on conflict on constraint pr_cd_key do nothing
;