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

网址

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

同类其他

数据库

Linux下Oracle数据库配置日志目录及统一迁移

很多运维人员习惯采用默认安装的方式安装Oracle数据库,而Oracle日志默认放置在/opt目录下,绝大多数Linux环境的大磁盘往往挂载在/home,因此经常会出现磁盘空间不足的情况,采用本文配置可指定并迁移日志

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

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

ORA-00257: archiver error. Connect internal only, until freed.

登录Oracle报错 ORA-00257: archiver error. Connect internal only, until freed. 由于归档日志(archive log)已满引起的。

Oracle存储过程Procedure基础语法

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

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

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

SQL语句中DELETE、TRUNCATE和DROP的区别

当我们需要清理或删除某张表或数据的时候,通常会有采取DELETE、TRUNCATE、DROP的任意一种形式的SQL语句,他们之间作用的对象不同所产生的效果也各不相同,包括执行结果和效率

选择个人头像

昵称

邮箱

QQ

网址

评论提示

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