文章目录

  • 1 概述
  • 2 insert 的两种形式
    • 2.1 insert first
    • 2.2 insert all
  • 3 数据一致性(同时插入)
    • 3.1 验证:insert into 数据不一致
    • 3.2 验证:insert all 数据一致

1 概述

1. 作用:'正确、高效' 的将 '同一批数据' 插入至 '不同的表' 中2. 好处(1) '正确':避免数据差异(2) '高效':优于写多个 insert into(因为无论插入多少张表,'主表' 只会被读取一次)3. 场景,若需求:将表 t 中的数据 '同时插入' 至表 t1、t2若不知晓 insert all 语句,咱可能会使用 insert into 两次insert into t1 select * from t;insert into t2 select * from t;问题:在两次 insert 过程中,有可能 t 表的数据发生了改变,从而导致 t1、t2 '得到的数据不一致'。解决办法:insert all

2 insert 的两种形式

1. insert first: 仅对 '第一个' 匹配成功项进行插入
2. insert all  : 对 '每个' 匹配成功项都进行插入

基础数据准备:

create table stu_info (sno   number(3),sname varchar2(30),sex   varchar2(2)
);insert into stu_info(sno, sname, sex) values(1, '瑶瑶', '女');
insert into stu_info(sno, sname, sex) values(2, '优优', '男');
insert into stu_info(sno, sname, sex) values(3, '倩倩', '女');
commit;-- 两张测试表
create table stu_info_1 as select * from stu_info where 1 = 2;
create table stu_info_2 as select * from stu_info where 1 = 2;

2.1 insert first

-- 仅对 '第一个' 匹配成功项进行插入
insert firstwhen sno >= 2 then -- 不能用别名哦,如:t.snointo stu_info_1(sno, sname, sex)when sno >= 3 theninto stu_info_2(sno, sname, sex)
select t.sno, t.sname, t.sex from stu_info t;

查询结果:

select * from stu_info;
select * from stu_info_1;
select * from stu_info_2;

图示:仅对 ‘第一个’ 匹配成功项进行插入

2.2 insert all

-- 对 '每个' 匹配成功项都进行插入
insert allwhen sno >= 2 then -- 不能写别名哦,如:t.snointo stu_info_1(sno, sname, sex)when sno >= 3 theninto stu_info_2(sno, sname, sex)
select t.sno, t.sname, t.sex from stu_info t;

查询结果:对 ‘每个’ 匹配成功项都进行插入

3 数据一致性(同时插入)

3.1 验证:insert into 数据不一致

1. 模拟:将表 stu_info 中的数据同时插入 stu_info_1 和 stu_info_22. 分三个窗口模拟 '同时插入(并行)'(1) 窗口1: 将 stu_info 数据插入 stu_info_1(模拟时长 30 s)(2) 窗口2: 将 stu_info 数据插入 stu_info_2(模拟时长 30 s)(3) 窗口3:此时更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内) 3. 清空表 stu_info_1、stu_info_2 -- 若有数据truncate table stu_info_1;truncate table stu_info_2;4. dbms_lock 包权限 -- 若无权限,sys 用户授权-- conn system/system@orcl as sysdbagrant execute on sys.dbms_lock to scott;

图示:

窗口1:插入 stu_info_1,更新 sno = 2 的记录时,等待(模拟执行时长)

declare
beginfor i in 1 .. 3 loopif i = 2 thendbms_lock.sleep(30); -- 模拟执行时长:30 秒end if;insert into stu_info_1(sno, sname, sex)select t.sno, t.sname, t.sex from stu_info t where t.sno = i;commit;end loop;
end;

窗口2:插入 stu_info_1,更新 sno = 3 的记录时,等待(模拟执行时长)

declare
beginfor i in 1 .. 3 loopif i = 3 thendbms_lock.sleep(30); -- 模拟执行时长:30 秒end if;insert into stu_info_2(sno, sname, sex)select t.sno, t.sname, t.sex from stu_info t where t.sno = i;commit;end loop;
end;

窗口3:更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内)

update stu_info t set t.sname = 'update_2', t.sex = '22' where t.sno = 2;
commit;

测试结果:stu_info_1 和 stu_info_2 两者记录不一致!

3.2 验证:insert all 数据一致

1. 同理,可分为 两个窗口测试2. 清空表 stu_info_1、stu_info_2,并还原 stu_info 的数据

窗口1:插入数据至 stu_info_1 和 stu_info_1

declare
beginfor i in 1 .. 3 loopif i = 2 thendbms_lock.sleep(30); -- 模拟执行时长:30 秒end if;insert all into stu_info_1(sno, sname, sex) into stu_info_2(sno, sname, sex)select t.sno, t.sname, t.sex from stu_info t where t.sno = i; commit;end loop;
end;

窗口2:更新 stu_info 记录,使之影响 tu_info_1 和 stu_info_2(上述模拟时长内)

update stu_info t set t.sname = 'update_3', t.sex = '33' where t.sno = 3;
commit;

测试结果:

Oracle insert all 详解相关推荐

  1. Oracle建立全文索引详解

    Oracle建立全文索引详解 1.全文检索和普通检索的区别 不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作: SELECT *F ...

  2. oracle语句中dual什么意思,oracle中dual详解

    oracle中dual详解 基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. ...

  3. php insert什么意思,PHP insert语法详解

    PHP insert语法详解 上次程序中有这么一句话: $exec="insert into info (ename,pcname) values ('".$_POST[" ...

  4. oracle11 share pool,Oracle Shared pool 详解

    . Shared Pool概述 在之前的blog对的内存也做了一个概述,参考: Oracle内存架构详解 在网上搜到一篇介绍shared pool非常详细的pdf资料. 原文链接以找不到,但还是要感谢 ...

  5. Oracle 表分区详解(partition table)

    文章目录 1 概述 1.1 思维导图 2 分类 2.1 传统表分区 2.1.1 范围分区 range 2.1.2 列表分区 list 2.1.3 哈希分区 hash 2.1.4 复合分区 range ...

  6. oracle中minus作的应用,Oracle minus用法详解及应用实例

    Oracle minus用法详解及应用实例 Oracle minus用法 "minus"直接翻译为中文是"减"的意思,在Oracle中也是用来做减法操作的,只不 ...

  7. oracle控制文件都一样么,Oracle控制文件详解

    一.Oracle控制文件 为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 ...

  8. Oracle cursor_sharing 参数 详解

    一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...

  9. oracle参数文件initorcl位置,oracle 参数文件详解

    参数文件 两类参数文件: pfile:文本文件的参数文件,可以使用vi,vim等编辑器修改,文件名通常为init.ora spfile:二进制的参数文件,不能直接修改,只能存放在Oracle服务器端, ...

最新文章

  1. 阿里CTO张建锋:云拐点已至,All in cloud;贾扬清完整title公开
  2. 函数式编程语言python-Python——五分钟理解函数式编程与闭包
  3. vector删除数据时有什么需要注意的吗 ?
  4. pandas读取文件——CSV,Excel
  5. 微信小程序 最全 生成带参数二维码
  6. 【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)
  7. win10更新不动_win10沙盒功能和其他同类程序的区别
  8. 【XML】XML树形结构
  9. 加密Python脚本
  10. PE系统-微PE工具箱V2.1 - 有情怀的PE - PE中的战斗鸡无广告VIP精品
  11. Linux——eth0,eth1,eth2,lo及ifconfig命令
  12. 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
  13. 上传文件到服务器太大怎么办,超大文件怎么上传到云服务器
  14. X64dbg-插件开发-字符编码-常用插件函数-回调结构
  15. Windows桌面图片打开慢的原因 wyz_csdn
  16. 【翻译】开发者体验门户 后台 如何解决Spotify的复杂性问题
  17. 脚本链接 ssh 自动输入密码
  18. 360无线升级服务器密码,360wifi扩展器默认密码_管理员密码是什么?-192路由网
  19. 5个非常实用的小程序UI设计模板分享
  20. 聊聊提问的艺术(日本版)

热门文章

  1. PLook——记录你的知识
  2. PHP判断是否是json字符串
  3. 子线程是否要手动创建autoreleasepool
  4. Android Camera2 实现高帧率预览录制(附源码)
  5. 滚齿机 桥式起重机 分级机 异步鼠笼电机 压铸模 玩具电话 注塑模设计 提升机CAD 起重机 过滤器 自吸灌装机…设计
  6. 不同虚拟化技术 virtio 之间的区别
  7. 6、远程终端工具安装
  8. 最详细的计算机网络思维导图 谢希仁(第七版)——第一章
  9. 最新PHP面试题汇总(附答案)
  10. Java多线程学习之路(四)---死锁(DeadLock)