Oracle insert all 详解
文章目录
- 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 详解相关推荐
- Oracle建立全文索引详解
Oracle建立全文索引详解 1.全文检索和普通检索的区别 不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作: SELECT *F ...
- oracle语句中dual什么意思,oracle中dual详解
oracle中dual详解 基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. ...
- php insert什么意思,PHP insert语法详解
PHP insert语法详解 上次程序中有这么一句话: $exec="insert into info (ename,pcname) values ('".$_POST[" ...
- oracle11 share pool,Oracle Shared pool 详解
. Shared Pool概述 在之前的blog对的内存也做了一个概述,参考: Oracle内存架构详解 在网上搜到一篇介绍shared pool非常详细的pdf资料. 原文链接以找不到,但还是要感谢 ...
- 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 ...
- oracle中minus作的应用,Oracle minus用法详解及应用实例
Oracle minus用法详解及应用实例 Oracle minus用法 "minus"直接翻译为中文是"减"的意思,在Oracle中也是用来做减法操作的,只不 ...
- oracle控制文件都一样么,Oracle控制文件详解
一.Oracle控制文件 为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 ...
- Oracle cursor_sharing 参数 详解
一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...
- oracle参数文件initorcl位置,oracle 参数文件详解
参数文件 两类参数文件: pfile:文本文件的参数文件,可以使用vi,vim等编辑器修改,文件名通常为init.ora spfile:二进制的参数文件,不能直接修改,只能存放在Oracle服务器端, ...
最新文章
- 阿里CTO张建锋:云拐点已至,All in cloud;贾扬清完整title公开
- 函数式编程语言python-Python——五分钟理解函数式编程与闭包
- vector删除数据时有什么需要注意的吗 ?
- pandas读取文件——CSV,Excel
- 微信小程序 最全 生成带参数二维码
- 【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)
- win10更新不动_win10沙盒功能和其他同类程序的区别
- 【XML】XML树形结构
- 加密Python脚本
- PE系统-微PE工具箱V2.1 - 有情怀的PE - PE中的战斗鸡无广告VIP精品
- Linux——eth0,eth1,eth2,lo及ifconfig命令
- 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
- 上传文件到服务器太大怎么办,超大文件怎么上传到云服务器
- X64dbg-插件开发-字符编码-常用插件函数-回调结构
- Windows桌面图片打开慢的原因 wyz_csdn
- 【翻译】开发者体验门户 后台 如何解决Spotify的复杂性问题
- 脚本链接 ssh 自动输入密码
- 360无线升级服务器密码,360wifi扩展器默认密码_管理员密码是什么?-192路由网
- 5个非常实用的小程序UI设计模板分享
- 聊聊提问的艺术(日本版)