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

简介: 使用Insert Select实现同时向多个表插入记录一、无条件 INSERT ALL-----------------------------------------------------...

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



一、无条件 INSERT ALL


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


INSERT ALL


insert_into_clause values_clause_1


[insert_into_clause values_clause_2


……


Subquery;


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


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


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





二、条件 INSERT ALL


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


INSERT ALL


WHEN condition THEN insert_into_clause values_clause


[WHEN condition THEN] [insert_into_clause values_clause]


……


[ELSE] [insert_into_clause values_clause


Subquery;


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


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


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


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





三、条件 INSERT FIRST


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


INSERT FIRST


WHEN condition THEN insert_into_clause values_clause


[WHEN condition THEN] [insert_into_clause values_clause]


……


[ELSE] [insert_into_clause values_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



   
Tablesz_test(id int,name varchar2(10));


          
z_test1(id int ,name varchar2(10));


          
z_test2(id int);


          
z_test3(name varchar2(10);


初始数据:z_test


Id    Name


10    133


5    184


1    18423


1    18445


1    18467


6    129


2    12923


2    12945


z_test1
z_test2,z_test3均为空。





测试一:无条件 INSERT ALL


    SQL 语句:


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


SQLInsert All 


  2  Into z_test1
(id,namevalues (id,name)


  
3  Into z_test2(idvalues(id)


  
4  Select id,name from z_test;





16 rows created.


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


测试结果:


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


SQLselect from z_test1;





        
ID NAME


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


        
10 133


         5 184


         1 18423


         1 18445


         1 18467


         6 129


         2 12923


         2 12945





8 rows selected
.





SQLselect from z_test2;





        
ID


----------


        
10


         5


         1


         1


         1


         6


         2


         2





8 rows selected
.


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





测试二:条件 INSERT ALL


    SQL 语句:


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


SQLInsert All


  2  when id
>5 then into z_test1(idnamevalues(id,name)


  
3  when id<>2 then into z_test2(idvalues(id)


  
4  else into z_test3 values(name)


  
5  select id,name from z_test;





10 rows created.


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


测试结果:


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


SQLselect from z_test1;





        
ID NAME


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


        
10 133


         6 129





SQL
select from z_test2;





        
ID


----------


        
10


         5


         1


         1


         1


         6





6 rows selected
.





SQLselect from z_test3;





NAME


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


12923


12945





2 rows selected
.


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





测试三:条件 INSERT FIRST


    SQL 语句:


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


SQLInsert First 


  2  when id
=1 then into z_test1 values(id,name)


  
3  when id>5 then into z_test2 values(id)


  
4  else into z_test3 values(name)


  
5  select from z_test;





8 rows created.


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


测试结果:


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


SQLselect from z_test1;





        
ID NAME


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


         
1 18423


         1 18445


         1 18467





3 rows created
.





SQLselect from z_test2;





        
ID


----------


        
10


         6





2 rows created
.





SQLselect from z_test3;





NAME


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


184


12923


12945





3 rows created
.

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
5月前
|
SQL 数据库
SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段
SQL INSERT INTO 语句用于在表中插入新记录。
222 0
|
6月前
|
关系型数据库 PostgreSQL
postgresql insert into插入记录时使用select子查询
postgresql insert into插入记录时使用select子查询
|
8月前
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
55 1
|
Web App开发 前端开发 搜索推荐
关于table的一些记录
HTML有10个表格相关标签
关于table的一些记录
|
SQL
表复制:SELECT INTO 和 INSERT INTO SELECT
表复制:SELECT INTO 和 INSERT INTO SELECT
137 0
|
关系型数据库 MySQL
MySQL防止重复插入相同记录 insert if not exists
MySQL防止重复插入相同记录 insert if not exists
1225 0
|
关系型数据库 MySQL 数据库
插入命令 insert 和查询命令 select 的组合使用|学习笔记
快速学习插入命令 insert 和查询命令 select 的组合使用
1699 0
|
SQL
SQL|表中添加、删除或修改列。
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。 ALTER TABLE 语法 如需在表中添加列,请使用下面的语法: ALTER TABLE table_name ADD column_name datatype 如需删除表中的列,...
946 0