Oracle数据库MERGE INTO语句条件入库

Oracle 9i版本引入MERGE INTO语句,其主要用于实现条件入库能力,用于解决对于已有数据更新升级的情况,即可实现不存在数据则插入,存在数据则更新的分支判断形式的更新能力

所属分类 数据库

相关标签 Oracle条件插入

MERGE INTO应用场景

米虫最近在做老系统跨版本升级,在整理升级SQL的时候,无意中学习到Oracle中的MERGE INTO语法。

MERGE INTO主要用于解决对于已有数据更新升级的情况。

一般我们升级数据库记录,都是直接写update语句,如果这个记录压根不存在,那就尴尬了。

比较常见的做法是,先delete记录在insert记录,这样可以保证执行不出错。

比如:

DELETE FROM mebugs_run WHERE runid = "GOINDOWN";
commit;
INSERT INTO mebugs_run (runid, runname) VALUES ("GOINDOWN", "THIS_IS_NEW");
commit;

SQL Sever可以通过IF...ELSE...实现条件入库。

MySQL可以通过REPLACE INTO实现条件入库(有特殊约束体条件)。

Oracle 9i引入INSERT INTO语句,语法这里不贴了,直接用实例来讲解。

MERGE INTO实例

INSERT INTO语句的强大之处在于可以任意判断某个字段是否存在某个值。

MERGE INTO mebugs_run T1
--检查GOINDOWN这个字符串在mebugs_run表的runid列是否存在
--此处用FROM dual实际上是为了提取一个"GOINDOWN"的字符串,具体原因在下方有解释
USING (SELECT "GOINDOWN" runid FROM dual) T2
--判断mebugs_run T1中的runid字段是不是有"GOINDOWN"
ON ( T1.runid=T2.runid)
WHEN MATCHED THEN
    --存在进行UPDATE
    --这里更新的是mebugs_run T1中的runid字段是"GOINDOWN"的记录
    --需要注意UPDATE的条数不一定是一条
    UPDATE SET T1.runname = "MAX_OPEN_FLAG"
WHEN NOT MATCHED THEN
    --不存在进行INSERT
    INSERT (runid, runname) VALUES ("GOINDOWN", "MAX_OPEN_FLAG");
commit;

在一个同时存在INSERT和UPDATE语法的MERGE INTO语句中,总共INSERT/UPDATE的记录数,就是USING语句中alias2(T2)的记录数(alias2就是上面实例的T2)。

一定要注意USING后面的条件语句,上文实例FROM dual最终只会update表中runid = "GOINDOWN"的记录,因为T2只会返回一个结果。

如果把

  • USING (SELECT "GOINDOWN" runid FROM dual) T2

改成

  • USING (SELECT runid FROM mebugs_run WHERE runid = "GOINDOWN") T2

那么这个句子就不一定能够INSERT了,因为ON ( T1.runid=T2.runid)如果不存在该记录的时候条件语句返回直接是空。

所以,MERGE INTO还是很危险的,说不得本来想更新一条记录,一不小把整个表刷个遍(那你就要绝望了)

重点关注USING ON条件语句返回的情况。

结尾小结

使用MERGE INTO语句需要清晰理解一个执行过程。

  1. 查询表中满足条件的数据是否存在
  2. 如果存在则走UPDATE逻辑,且更新的数据为步骤1中满足条件的数据
  3. 如果不存在则走INSERT逻辑
  4. UPDATE和INSERT均是可选择使用的,无需的执行的部分可以直接不写

因此,在MERGE INTO语句中梳理条件(USING ON条件语句)是一个非常关键的事情。

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

数据库

Oracle存储过程Procedure基础语法

存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。

SPOOL导出指定格式的Oracle数据文件

为了方便数据的处理,或者本身有特殊的数据格式要求,我们可以使用SPOOL命令导出Oracle数据库数据数据文件,并指定格式,高效且强大...

Orcale定时任务管理dbms_job

在Oracle中创建、运行、维护定时任务,配合存储过程可以完成很多特定的业务诉求,dbms_job提供了使用的API功能便于我们实现更为细致的定时任务管理

Oracle数据库基础实用维护命令集

Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句

MongoDB通过$lookup实现多表连接查询

对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询

MySql数据库设置表名大小写不敏感

MySql数据库在Linux系统下默认数据库名与表名严格区分大小写,一般情况下我们创建表名习惯使用全小写,如果遇到某些从Windows服务器迁移过来的数据库可能需要设置大小写不敏感

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核