米虫最近在做老系统跨版本升级,在整理升级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语句,语法这里不贴了,直接用实例来讲解。
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只会返回一个结果。
如果把
改成
那么这个句子就不一定能够INSERT了,因为ON ( T1.runid=T2.runid)如果不存在该记录的时候条件语句返回直接是空。
所以,MERGE INTO还是很危险的,说不得本来想更新一条记录,一不小把整个表刷个遍(那你就要绝望了)
重点关注USING ON条件语句返回的情况。
使用MERGE INTO语句需要清晰理解一个执行过程。
因此,在MERGE INTO语句中梳理条件(USING ON条件语句)是一个非常关键的事情。
当前还没有观点发布,欢迎您留下足迹!
很多运维人员习惯采用默认安装的方式安装Oracle数据库,而Oracle日志默认放置在/opt目录下,绝大多数Linux环境的大磁盘往往挂载在/home,因此经常会出现磁盘空间不足的情况,采用本文配置可指定并迁移日志
Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句
登录Oracle报错 ORA-00257: archiver error. Connect internal only, until freed. 由于归档日志(archive log)已满引起的。
存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。
对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询
当我们需要清理或删除某张表或数据的时候,通常会有采取DELETE、TRUNCATE、DROP的任意一种形式的SQL语句,他们之间作用的对象不同所产生的效果也各不相同,包括执行结果和效率