常规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的更多相关文章

  1. Oracle INSERT ALL 语句介绍

    描述 Oracle INSERT ALL 语句用来用一个 INSERT 语句添加多行.该行可以只使用一个SQL命令插入到一个表或多个表. 语法 Oracle INSERT ALL 语法如下: INSE ...

  2. oracle Insert 一次插入多条记录

    oracle Insert 一次插入多条记录有两种方法: 1)Insert All Into table_name values ... insert all into table_name valu ...

  3. Oracle Insert 多行(转)

    1.一般的insert 操作. 使用语法insert into table_name[(column[,column...])] values (value[,value…])的insert语句,每条 ...

  4. oracle insert &字符插入问题

    例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...

  5. [Oracle] Insert All神奇

    无条件插入 Oracle中间insert all它指的是相同的数据组成不同的表.如果有需求现在:该t插入数据表t1,t2,假设你不知道insert all.您可以使用insert插入2次要,例如,见下 ...

  6. C# Oracle insert 中文乱码

    问题描述: 在PL SQL中insert 中文数据,显示不乱码,通过后台insert的中文数据,显示问号. 解决分三步: 1.Select userenv('language') from dual; ...

  7. oracle insert into 插入多组数据方法总结

    网上好多oracle 的文章,多是以oracle开头,内容确实其他sql,一幅气死人不偿命的嘴脸着实让人难受. 今天就更新点oracle 使用insert into插入数据的方式: 1.oracle ...

  8. oracle insert、append、parallel、随后查询的redo与磁盘读写

    SQL> set autotrace traceonly statistics; SQL> insert into big_table_dir_test1 select * from bi ...

  9. [Oracle] Insert All的妙用

    无条件的插入 Oracle中的insert all是指把同一批数据插入到不同的表中,假如如今有个需求:把t表中的数据分别插入t1,t2,假设你不知道insert all,你可能会使用insert插入2 ...

  10. ORACLE INSERT ALL 用法

    1INSERT ALL 1.1句法 multi_table_insert :: = conditional_insert_clause :: = 1.2multi_table_insert 在多表插入 ...

随机推荐

  1. Visual Studio 2013智能提示失效解决办法

    各种解决VS2013智能提示失效办法: 1.重置所有设置    工具->导入导出设置->重置所有设置 2.智能提示开关: 工具->选项->文本编辑器->C#->常规 ...

  2. MANACHER---求最长回文串

    求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的 ...

  3. 咏南CS多层插件式开发框架支持最新的DELPHI XE7

    DATASNAP中间件: 中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守: 可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码: 支持传统TCP/IP方式也支持RE ...

  4. 2015年必火的五个Html5移动开发工具推荐

    NO.1   DCloudHBuilder:基于HTML5开发工具 中文官网:http://www.dcloud.io/ DCloudHBuilder:基于HTML5开发工具是当前最快的HTML开发工 ...

  5. UVa 10900 So you want to be a 2n-aire? (概率DP,数学)

    题意:一 个答题赢奖金的问题,玩家初始的金额为1,给出n,表示有n道题目,t表示说答对一道题目的概率在t到1之间,每次面对一道题,可以选择结束游戏, 获得当 前奖金:回答下一道问题,答对的概率p在t到 ...

  6. MAT(2)安装Memory Analyzer

    http://www.eclipse.org/mat/ 两大功能: 1.find memory leaks 2.reduce memory consumption 安装步骤: 1. 打开 eclips ...

  7. 根据powerdesigner的OO模型生成C#代码

    2007-05-15 08:34:11|  分类: 转贴部分 |  标签:学习帖子 |字号 订阅 习惯了用Powerdesigner设计数据库模型,XDE设计类图.因此我一般的设计方法是用PD做分析模 ...

  8. Linq to SQL 绑定 ComboBox

    最近学习Linq to SQL,发现Linq是一个开发轻量数据库的好东西,大大简化了数据连接.查询过程.但是在绑定ComBoBox的时间发现了一个问题:Linq查询后得到的数据tolist后,只能实现 ...

  9. PostgreSQL的 initdb 源代码分析之九

    继续:下面的是定义信号处理函数. /* * now we are starting to do real work, trap signals so we can clean up */ /* som ...

  10. C++ 析构方法

    1.什么是析构方法? 析构方法与构造方法互补. 2.为什么设计析构方法? 构造方法创建一个对象,对象内部往往还会申请一些资源.设计析构方法的目的是 释放资源,同时销毁自身. 3.析构方法可以认为分为两 ...