OceanBase系列---【oracle模式的存在即更新,不存在即新增的merge into用法】
一、需求
写一个存在即更新,不存在即新增的sql。表里没有id,是一个联合主键,所以为了防止并发下的安全问题,使用sql的merge into来实现。
二、分析
MERGE INTO: 这是 Oracle 模式下处理 Upsert(更新或插入)最标准、最高效的语法。
USING (...): 这里构造了一个虚拟数据源 S,里面包含了你当前要处理的客户号和员工号。
ON (...): 这是判断依据,只要表中已经有了这个组合 (CUST_NO + EMP_ID),就会进入 WHEN MATCHED 分支。
并发安全: OceanBase 的 MERGE INTO 语句在底层实现了原子性操作,在高并发场景下也能保证计数准确,不会出现多线程冲突导致数据不一致的问题。
三、案例
CREATE TABLE CALL_RECORD (
CUST_NO VARCHAR2(50) NOT NULL,
EMP_ID VARCHAR2(50) NOT NULL,
CALL_COUNT NUMBER DEFAULT 0,
CREATE_TIME DATE DEFAULT SYSDATE,
UPDATE_TIME DATE DEFAULT SYSDATE,
-- 将联合字段设为主键,自动隐含了唯一约束
CONSTRAINT PK_OUTBOUND_CALL_STATS PRIMARY KEY (CUST_NO, EMP_ID)
);
#把下面的'C001','E88'替换成占位符即可
MERGE INTO OUTBOUND_CALL_STATS T
USING (SELECT 'C001' AS INPUT_CUST, 'E888' AS INPUT_EMP FROM DUAL) S
ON (T.CUST_NO = S.INPUT_CUST AND T.EMP_ID = S.INPUT_EMP)
WHEN MATCHED THEN
-- 记录存在:次数加1,更新时间
UPDATE SET
T.CALL_COUNT = T.CALL_COUNT + 1,
T.UPDATE_TIME = SYSDATE
WHEN NOT MATCHED THEN
-- 记录不存在:插入新数据,次数初始化为1
INSERT (CUST_NO, EMP_ID, CALL_COUNT, CREATE_TIME, UPDATE_TIME)
VALUES (S.INPUT_CUST, S.INPUT_EMP, 1, SYSDATE, SYSDATE);
愿你走出半生,归来仍是少年!
浙公网安备 33010602011771号