各位童鞋大家好,今天进行基础sql第二篇.上一篇说到oracle的 insert语句。可能少量出入oracle江湖的童鞋对它不熟悉,insert语句不是insert into mytable(xx, xx, xx...) values (ss, ss, ss...)么。不错,这也是oracle的insert语句,而且这是最基本,重要的语句。但是这条语句在有些复杂点的实际业务当中,并不能很好的解决问题。比如:有这么个需求场景,前期产生一个账单,都会对应生成一个账单对应记录保存到DB,但是因为各种原因,并不能保证每一条账单都能够准确无误的入库入表。这个时候可能就需要通过另个入口,或者日志进行补偿操作。补偿操作就必须要判断数据表里是否已经有了某条账单,有就不操作(或者会更新某些字段),无则要做新增操作。那么这时候上一篇的结尾语句就派上用场了。
MERGE INTO my_table mt
USING (SELECT id as id FROM dual) d2
ON (mt.id = d2.id)
/*WHEN MATCHED THEN
UPDATE SET mt.name = 'myname', mt.age = 22*/
WHEN NOT MATCHED THEN
INSERT
(id, name, age, mydife_time, created_time)
VALUES
('seq', 'myname', 19, sysdate, sysdate);
这条语句简单解释下,通过服务端传过来的id,匹配my_table表id,如果有符合相等条件匹配项,则可进行需要的更新操作。否则,进行insert操作。这样就能确保补偿操作都能顺利进行了。希望童鞋们都能够掌握这条sql语句,再遇到类似场景就能完美解决了。
好了,基础的增,删,改,查语句都介绍完毕了。接下来继续看下面一条sql.
insert all into mytable
values
(id, name, age, mydife_time, created_time)
select A.*
from (select xx, xx, xx, xx, xx from dual
union all
select xx, xx, xx, xx, xx from dual .. .) A;
select xx ... from dual 参数可通过服务端参数传入。
insert all into 语句就是oracle 的批量插入语句了。批量插入的优点就是减少创建,关闭连接,减少提交次数从而很大程度提高sql执行效率。oracle批量插入sql语法设计很好记忆了,它与单条插入就是多了个 all关键字.所以童鞋们这条语句请掌握好,当你遇到大数据量业务时候,它也是经常出现的哦。
为了便于童鞋们更好理解这条语句,我结合mybatis,完整的书写下这条语句,如下:
INSERT ALL INTO my_table VALUES
(id, name, age, mydife_time, created_time)
select A.* from (
<foreach collection="list" item="item" index="inde" separator="UNION ALL">
select
#{item.id, jdbcType=BIGINT} id,
#{item.name, jdbcType=VARCHAR} name,
#{item.age, jdbcType=VARCHAR} age,
#{item.mydife_time, jdbcType=TIMESTAMP} mydife_time
from dual
</foreach>
) A
关于批量插入sql,有些在数据层还是写一条insert into mytable(xx, xx, xx...) values (ss, ss, ss...)简单语句。服务端结合一些框架进行batchInsert操作,
当进行了insert一定量的时候(比如1000),直接通过程序进行提交操作。这样就能简化sql的写法。因本系列主要针对sql讲解,所以服务端程序方面不进行过多介绍.
好了,通过2篇幅的介绍,已经把oracle insert常用语句介绍完毕,总共3种,一种是insert into ,一种是 insert all into ,一种是 merge into.他们的作用分别
是单条插入,批量插入,merge操作。在实际工作中,根据业务需求适当选择其中一种 insert语句。基本可以比较完美的解决绝大部分场景需求了。
再看一种写法:
begin
insert into my_table(name, age, created_time, id)
values('11111',123,sysdate,2);
insert into my_table(name, age, created_time, id)
values('22222',133,sysdate,3);
end;
begin,end;中间部分可以由服务端传入list进行迭代循环赋值。这样也可以进行批量新增操作。
好了,这篇先到此吧。下一篇咱们聊聊update, 继续咱们基础的sql之旅吧!
(不急,很快的)