Oracle中 insert all 语句用法详解

170 篇文章 14 订阅

在工作中,有时会遇到这样的需求:将数据插入多个表中。

怎么实现呢?

方法1:使用insert into语句分别插入,效率较低。
方法2:使用insert all语句批量插入数据,效率较高。(insert all又分为无条件插入和有条件插入)

一、表和数据准备

--创建表
SQL> CREATE TABLE test1(
   ID   NUMBER(3),
   NAME VARCHAR2(20),
   SEX  VARCHAR2(2),
   AGE  NUMBER(3)
);
 

--向test1表中插入数据
SQL> INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(1, '张三', '女', '21');
SQL> INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(2, '李四', '男', '25');
SQL> INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(3, '王五', '女', '22');
SQL> commit;

--复制表结构创建表test2,test3
SQL> CREATE TABLE test2 AS SELECT t.* FROM test1 t WHERE 1 = 2;
SQL> CREATE TABLE test3 AS SELECT t.* FROM test1 t WHERE 1 = 2;

--查询表
SQL>  select * from test1;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22

SQL> select * from test2;

no rows selected

SQL> select * from test3;

no rows selected

二、insert all 无条件插入

--将test1表中的数据插入test2和test3表中
SQL> insert all
     into test2 values(id,name,sex,age)
	 into test3 values(id,name,sex,age)
	 select id,name,sex,age from test1;
SQL> commit;
--查询表
SQL> select * from test2;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22


SQL> select * from test3;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22

同时向多张表插入新数据也可以通过如下语句:

--同时向3张表中插入单条相同新数据
SQL> insert all
     into test1 values(4,'赵六','女','19')
     into test2 values(4,'赵六','女','19')
     into test3 values(4,'赵六','女','19')
     select 1 from dual;
SQL> commit;

--查询表
SQL> select * from test1;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         4 赵六                 女         19
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22

SQL> select * from test2;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22
         4 赵六                 女         19

SQL> select * from test3;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22
         4 赵六                 女         19
--先删除表中数据
 SQL>  delete from test1;
 SQL>  delete from test2;
 SQL>  delete from test3;
 SQL> commit;
  
--同时向多张表中插入多条不同数据语句
 SQL> insert all
      into test1 values(1,'张三','女','21')
      into test1 values(2, '李四', '男', '25')
      into test2 values(3, '王五', '女', '22')
      into test3 values(4,'赵六','女','19')
      into test3 values(5,'孙七','女','23')
      select 1 from dual;
SQL> commit;

--查询表
SQL> select * from test1;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         
SQL> select * from test2;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         3 王五                 男         22

SQL> select * from test3;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         4 赵六                 女          19
         5 孙七                 女          23

三、insert all 有条件插入

有条件插入又分为两种:insert all when…和insert first when…

insert all when类型:

--删除表中数据
SQL> delete from test1;
SQL> delete from test2;
SQL> delete from test3;
SQL> commit;

--重新向test1表插入数据
SQL> commit;INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(1,'赵六','女','19');
SQL> commit;INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(2,'李四','男','25');
SQL> commit;INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(3,'王五','女','22');
SQL> commit;INSERT INTO test1(ID, NAME, SEX, AGE) VALUES(4,'赵六','女','19');
SQL> commit;

--向test2和test3表中有条件插入数据
SQL> insert all
    when id=1 then
	  into test2 values(id,name,sex,age)
	when id=2 then 
      into test3 values(id,name,sex,age)
    else
	  into test2 values(id,name,sex,age)
	select id,name,sex,age from test1;
SQL> commit;

--查询表
SQL> select * from test1;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25
         3 王五                 男         22
         4 赵六                 女         19

SQL> select * from test2;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         3 王五                 男         22
         4 赵六                 女         19

SQL> select * from test3;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         2 李四                 男         25

insert first when 类型:

--删除test2和test3表数据
SQL> delete from test2;
SQL> delete from test3;
SQL> commit;

--查询表
SQL> select * from test2;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         1 张三                 女         21
         2 李四                 男         25

SQL> select * from test3;

        ID NAME                 SEX        AGE
---------- -------------------- --- ----------
         3 王五                 男         22

insert all when 和 insert first when 的区别:

insert first是考虑先后关系的,如果有数据满足第一个when条件又满足第二个when条件,则执行第一个then插入语句,第二个then就不插入。反之有数据不满足第一个when条件且满足第二个when条件,则数据会插入第二个条件下对应的表中,这也正是insert first与inset all的区别。

简单来说就是insert all when只要满足条件,就会插入,这个会造成重复插入;insert first when只要有一个满足条件,后面的条件不再判断,不会造成重复插入。

注意:insert all 无法支持序列插入,会导致两边不一致。


参考文章:
https://www.cnblogs.com/jasonboren/p/12102490.html
https://www.cnblogs.com/masha2017/p/11413747.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用cx_Oracle模块执行SQL语句时,可以使用Cursor对象的execute方法。在调用execute方法之前,可以使用Cursor对象的prepare方法进行预编译,这样在执行execute时就不需要再写SQL语句参数了。 要使用cx_Oracle执行SQL语句,首先需要连接到Oracle数据库。可以使用cx_Oracle.connect函数提供的参数来建立与数据库的连接。连接成功后,可以创建一个Cursor对象来执行SQL语句。可以使用Cursor对象的execute方法来执行SQL语句,传入SQL语句作为参数。 例如,要执行一条查询语句,可以使用Cursor对象的execute方法传入SQL语句作为参数,然后使用Cursor对象的fetchall方法获取查询结果。例如: ```python import cx_Oracle # 建立与Oracle数据库的连接 connection = cx_Oracle.connect("username/password@localhost:1521/xe") # 创建一个Cursor对象 cursor = connection.cursor() # 执行SQL查询语句 cursor.execute("SELECT * FROM table_name") # 获取查询结果 results = cursor.fetchall() # 输出查询结果 for row in results: print(row) # 关闭Cursor对象和数据库连接 cursor.close() connection.close() ``` 以上代码演示了使用cx_Oracle模块执行SQL查询语句的基本步骤。可以根据实际需求进行修改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [cx_Oracle使用方法](https://blog.csdn.net/weixin_42769040/article/details/81629054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python使用cx_Oracle模块操作Oracle数据库详解](https://download.csdn.net/download/weixin_38623009/12825512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值