oracle--insert
常规insert语法就不说了,还有些特殊用法
1. insert all
into table1(col1,col2) values(v1,v2)
into table2(col1,col2) values(v1,v2)
......
select ...;
后面的select直接影响前面的into,查询出的每条记录分别执行一次into
示例:
insert all into t_banks values(id,name,al_name) select * from t_banks; --t_banks表中的数据会加倍,values是后面select出的列名
insert all into t_banks values('1','1','1') select 1 from dual; --t_banks表插入一条记录('1','1','1')
2. insert all/first
when ? then
into table1(col1,col2) values(v1,v2)
when ? then
into table2(col1,col2) values(v1,v2)
else
into table3(col1,col2) values(v1,v2)
select ...;
all有条件的插入,会依次判断每个符合的条件然后into
first有条件的插入,会找到第一个满足的条件然后into,后面的就不判断了
ps:业务中有这样的场景,如果有满足条件的记录就不插入,否则插入。
单线程下先select再insert是ok的,但是如果用户通过界面同时操作就有可能在数据库插入同一数据。
解决方法如下
- 在service层对方法synchronized,粗暴有效
如果项目需要集群就不好控制了
- 数据库层面,在表上加唯一约束,需要动表
场景:现有一张表存借款需求,每条需求有一个编号,如果有在处理中的需求,相同编号的借款需求不允许再次插入,否则可以再次把借款需求插入表,进行处理
解决:表上加一个字段SEQ,存同一编号的多条记录的序号1,2,3,4......,编号和SEQ添加唯一键
这个时候如果表中已有数据,使用下面的sql为已有数据添加SEQ
merge into t_loan_request lr
using(
select decode(rownum-min_sno,0,1,rownum+1-min_sno)sno,a.lr_id
from
(select lr_applyid,lr_id from t_loan_request order by lr_applyid,lr_id)a,
(select lr_applyid,min(rownum) min_sno
from(select lr_applyid,lr_id from t_loan_request order by lr_applyid,lr_id)r
group by lr_aplyid)b
where a.lr_applyid=b.lr_applyid
)req
on (lr.lr_id=req.lr_id)
when matched then
update set lr.seq=req.sno
插入数据sql如下:
insert into t_loan_request(lr_id,lr_applyid,lr_requeststatus,seq)
select seq_loan_request.nextval,'000123','0',(select count(1)+1 from t_loan_request where lr_applyid='000123')
from dual
where not exists(select lr_id from t_loan_request where lr_requeststatus!='3' and lr_applyid='000123')
上面的语句如果并发,lr_applyid+seq相同,数据库检查唯一性,最终导致只有一条记录入库成功
或者使用merge插入语句
merge into t_loan_request lr
using (select count(1) cnt from t_loan_request where lr_requeststatus!='3' and lr_appplyid='000123')req
on(req.cnt<1)
when matched then
insert (lr_id,lr_applyid,lr_requeststatus,seq)
values(seq_loan_request.nextval,'000123','0',(select count(1)+1 from t_loan_request where lr_applyid='000123'))
和上面的sql效果一样
- sql改造,网上看的,但觉得不可靠
INSERT INTO T_TABLE SELECT ?,?,?,?,? FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM T_TABLE T WHERE T.FIELD1 = ? AND T.FIELD2 = ?)
只是依靠这一条语句,如果并发,都符合where条件,同时入库插入成功
oracle--insert的更多相关文章
- Oracle INSERT ALL 语句介绍
描述 Oracle INSERT ALL 语句用来用一个 INSERT 语句添加多行.该行可以只使用一个SQL命令插入到一个表或多个表. 语法 Oracle INSERT ALL 语法如下: INSE ...
- oracle Insert 一次插入多条记录
oracle Insert 一次插入多条记录有两种方法: 1)Insert All Into table_name values ... insert all into table_name valu ...
- Oracle Insert 多行(转)
1.一般的insert 操作. 使用语法insert into table_name[(column[,column...])] values (value[,value…])的insert语句,每条 ...
- oracle insert &字符插入问题
例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...
- [Oracle] Insert All神奇
无条件插入 Oracle中间insert all它指的是相同的数据组成不同的表.如果有需求现在:该t插入数据表t1,t2,假设你不知道insert all.您可以使用insert插入2次要,例如,见下 ...
- C# Oracle insert 中文乱码
问题描述: 在PL SQL中insert 中文数据,显示不乱码,通过后台insert的中文数据,显示问号. 解决分三步: 1.Select userenv('language') from dual; ...
- oracle insert into 插入多组数据方法总结
网上好多oracle 的文章,多是以oracle开头,内容确实其他sql,一幅气死人不偿命的嘴脸着实让人难受. 今天就更新点oracle 使用insert into插入数据的方式: 1.oracle ...
- oracle insert、append、parallel、随后查询的redo与磁盘读写
SQL> set autotrace traceonly statistics; SQL> insert into big_table_dir_test1 select * from bi ...
- [Oracle] Insert All的妙用
无条件的插入 Oracle中的insert all是指把同一批数据插入到不同的表中,假如如今有个需求:把t表中的数据分别插入t1,t2,假设你不知道insert all,你可能会使用insert插入2 ...
- ORACLE INSERT ALL 用法
1INSERT ALL 1.1句法 multi_table_insert :: = conditional_insert_clause :: = 1.2multi_table_insert 在多表插入 ...
随机推荐
- 那些经常被遗忘的 Java 面试题
静态类和静态方法 如果一个类要被声明为static的,只有一种情况,就是静态内部类. 静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类, ...
- 第二百四十二天 how can I 坚持
今天... 貌似没啥啊. 第一天带帽子上班. 还有回来买了两个柚子吃了,有点上火啊. 还有今天雾霾爆表啊,pm2.5 600多啊. 还有看了部电影<蚁人>,挺好看.希望不会出二.三.四. ...
- 斜率DP题目
uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...
- [C语言 - 8] 枚举enum
枚举是c语言中得一种基本数据类型,不是数据结构 用于声明一组常数 1. 3中枚举变量的方式 a. 先定义类型, 再定义变量 b. 同时定义类型和变量 c. 匿名定义 enum Season {Spri ...
- String中的Indexof,LastIndexOf, Indexofany,LastIndexOfAny 的区别
本文转载自 http://www.cnblogs.com/qinying/archive/2008/09/22/1295730.html 定位子串是指在一个字符串中寻找其中包含的子串或者某个字符.在S ...
- Umbraco Forms 中的Recaptcha遇到的问题
在Umbraco Form中添加Recaptcha时,不能把它设置成Mandatory, 否则就会出错
- 内存映射文件详解-----C++实现
先不说内存映射文件是什么.贴个代码先,. #include <iostream> #include <fcntl.h> #include <io.h> #inclu ...
- Mysql知识要点总结
1.安装 要点:记得更改字符集 2.数据类型 常用数据类型:INT VARCHAR BLOG 3.操作数据库 SHOW DATABASES; CREATE DATABASE 名称; DROP DATA ...
- ASP导出Word带页眉页脚,中文不乱码
关键代码: <% Response.Clear() Response.CodePage= Response.Charset="UTF-8" Response.ContentT ...
- POS机刷卡失败的郁闷事
6月13号在老家的金店为未来老婆买首饰,刷的工行POS机. 结果8000多RMB从卡里扣了,商家又没收到钱……POS机提示“交易超时”…… 当天和商家到就近的工行,工行经理说他负责协调这事,只要钱到商 ...