使用Insert Select实现同时向多个表插入记录

使用InsertSelect实现同时向多个表插入记录



一、无条件INSERTALL


---------------------------------------------------------------------------------------------


INSERTALL


insert_into_clausevalues_clause_1


[insert_into_clausevalues_clause_2]


……


Subquery;


----------------------------------------------------------------------------------------------


1、指定所有跟随着的多表insert_into_clauses执行无条件的多表插入;


2、对于每个由子查询返回的行,Oracle服务器执行每一个insert_into_clause一次。





二、条件INSERTALL


---------------------------------------------------------------------------------------------


INSERTALL


WHENconditionTHENinsert_into_clausevalues_clause


[WHENconditionTHEN][insert_into_clausevalues_clause]


……


[ELSE][insert_into_clausevalues_clause]


Subquery;


--------------------------------------------------------------------------------------------


1、指定conditional_insert_clause来执行一个条件多表插入;


2、Oracle服务器通过相应的WHEN条件过滤每一个insert_into_clause,确定是否执行这个insert_into_clause;


3、一个单个的多表插入语句可以包含最多127个WHEN子句。





三、条件INSERTFIRST


--------------------------------------------------------------------------------------------


INSERTFIRST


WHENconditionTHENinsert_into_clausevalues_clause


[WHENconditionTHEN][insert_into_clausevalues_clause]


……


[ELSE][insert_into_clausevalues_clause]


Subquery;


--------------------------------------------------------------------------------------------


1、Oracle服务器对每一个出现在语句顺序中的WHEN子句求值;


2、如果第一个WHEN子句的值为true,Oracle服务器对于给定的行执行相应的INTO子句,并且跳过后面的WHEN子句
(后面的when语句都不再考虑满足第一个When子句的记录,即使该记录满足when语句中的条件)





注:多表INSERT语句上的约束


a、你只能在表而不能在视图上执行多表插入;


b、你不能执行一个多表插入到一个远程表;


c、在执行一个多表插入时,你不能指定一个表集合表达式;


d、在一个多表插入中,所有的insert_into_clauses不能组合指定多于999个目列;


e、只有当所有insert_into_clauses中的表数据都没有发生更新时,Rollback才会起作用。





EG
:


Tables:z_test(idint,namevarchar2(10));


z_test1(idint,namevarchar2(10));


z_test2(idint);


z_test3(namevarchar2(10);


初始数据:z_test


IdName


10133


5184


118423


118445


118467


6129


212923


212945


z_test1
,z_test2,z_test3均为空。





测试一:无条件INSERTALL


SQL语句:


----------------------------------------------------------------------------


SQL>InsertAll


2Intoz_test1
(id,name)values(id,name)


3Intoz_test2(id)values(id)


4Selectid,namefromz_test;





16rowscreated.


----------------------------------------------------------------------------


测试结果:


----------------------------------------------------------------------------


SQL>select*fromz_test1;





IDNAME


------------------------------


10133


5184


118423


118445


118467


6129


212923


212945





8rowsselected
.





SQL>select*fromz_test2;





ID


----------


10


5


1


1


1


6


2


2





8rowsselected
.


----------------------------------------------------------------------------





测试二:条件INSERTALL


SQL语句:


----------------------------------------------------------------------------


SQL>InsertAll


2whenid
>5thenintoz_test1(id,name)values(id,name)


3whenid<>2thenintoz_test2(id)values(id)


4elseintoz_test3values(name)


5selectid,namefromz_test;





10rowscreated.


----------------------------------------------------------------------------


测试结果:


----------------------------------------------------------------------------


SQL>select*fromz_test1;





IDNAME


------------------------------


10133


6129





SQL
>select*fromz_test2;





ID


----------


10


5


1


1


1


6





6rowsselected
.





SQL>select*fromz_test3;





NAME


--------------------


12923


12945





2rowsselected
.


----------------------------------------------------------------------------





测试三:条件INSERTFIRST


SQL语句:


----------------------------------------------------------------------------


SQL>InsertFirst


2whenid
=1thenintoz_test1values(id,name)


3whenid>5thenintoz_test2values(id)


4elseintoz_test3values(name)


5select*fromz_test;





8rowscreated.


----------------------------------------------------------------------------


测试结果:


----------------------------------------------------------------------------


SQL>select*fromz_test1;





IDNAME


------------------------------


118423


118445


118467





3rowscreated
.





SQL>select*fromz_test2;





ID


----------


10


6





2rowscreated
.





SQL>select*fromz_test3;





NAME


--------------------


184


12923


12945





3rowscreated
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值