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 语句在底层实现了原子性操作,在高并发场景下也能保证计数准确,不会出现多线程冲突导致数据不一致的问题。

三、案例

sql 复制代码
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);
相关推荐
风哥2号24 分钟前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录1 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶2 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea3 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
probex_3 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库
Patrick在香港4 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
这个DBA有点耶4 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析
数据库·mysql·代码规范
老纪的技术唠嗑局4 小时前
Agent 习惯性删库跑路,数据库纷纷学 Git 续命
数据库·人工智能
Data_Journal5 小时前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy
白远山5 小时前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析