PostgreSQL的upsert功能(insert on conflict do)的用法

建表语句:

DROP TABLE IF EXISTS "goods";
CREATE TABLE "goods" (
  "store_cd" int4 NOT NULL,
  "good_cd" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default"
);

INSERT INTO "goods" VALUES (101, '1', '张三');
INSERT INTO "goods" VALUES (102, '2', '李四');
INSERT INTO "goods" VALUES (103, '3', '王五');

ALTER TABLE "goods" ADD CONSTRAINT "pr_cd_key" PRIMARY KEY ("store_cd", "good_cd");

表数据:

数据存在则更新数据,不存在则插入数据

INSERT INTO GOODS VALUES ( 104, '4', '赵六' ) 
ON CONFLICT ON CONSTRAINT pr_key_cd DO
UPDATE 
	SET NAME = '更新' 
WHERE
	GOODS.STORE_CD = '104' 
	AND GOODS.GOOD_CD = '4'

pr_key_cd为必须为唯一主键,也可以用下面写法(注意:必须保证筛选出数据唯一)

INSERT INTO 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如果主键冲突则执行update,没有冲突就执行insert了。要是想先执行update语句呢?

update更新失败执行insert,更新成功则执行update。

WITH TABLE1 AS ( UPDATE GOODS SET NAME = '更新' WHERE STORE_CD = '104' AND GOOD_CD = '4' RETURNING * ) 
INSERT INTO GOODS SELECT  104, '4', '赵六' 
WHERE NOT EXISTS ( SELECT 1 FROM TABLE1 WHERE STORE_CD = '104' AND GOOD_CD = '4' )

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值