Oracle insert all 详解

2023-11-11

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 first
  when sno >= 2 then -- 不能用别名哦,如:t.sno
    into stu_info_1(sno, sname, sex)
  when sno >= 3 then
    into 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 all
  when sno >= 2 then -- 不能写别名哦,如:t.sno
    into stu_info_1(sno, sname, sex)
  when sno >= 3 then
    into 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_2

2. 分三个窗口模拟 '同时插入(并行)'
   (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 sysdba
   grant execute on sys.dbms_lock to scott;

图示:
在这里插入图片描述

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

declare
begin
  for i in 1 .. 3 loop
  
    if i = 2 then
      dbms_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
begin
  for i in 1 .. 3 loop
  
    if i = 3 then
      dbms_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
begin
   for i in 1 .. 3 loop
   
      if i = 2 then
         dbms_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;

测试结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle insert all 详解 的相关文章

  • invalid Key or Package

    使用EasyAR打包apk后出现invalid Key or Packag解决方案 1 Bundle ID IOS 和 PackageName Android 填写的对不对 2 回头看Unity里面Player Setting 里面的名字可
  • Qt 文件读写操作

    转载 http blog csdn net ei nino article details 7301132 文列出Qt读写文件常用方式 还有对文件的一些简单操作 读文件 cpp view plain copy print QString f
  • day28 回溯

    39 组合总和 数字可以被无限制选取 但是无需考虑顺序 组合 因此递归还是需要考虑startIdx 但是每次都从最开始进行回溯 而不是startIdx 1 40 组合总和II 通过标识去除重复值 树层去重 131 分割回文串 每次找到切割点
  • 孩子们的游戏(圆圈中最后剩下的数)

    每年六一儿童节 牛客都会准备一些小礼物去看望孤儿院的小朋友 今年亦是如此 HF作为牛客的资深元老 自然也准备了一些小游戏其中 有个游戏是这样的 首先 让小朋友们围成一个大圈 然后 他随机指定一个数米 让编号为0的小朋友开始报数 每次喊到M
  • firrtl

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 动手 sbt 2 之后 再回头看 chisel第一个实验 根据 https github com freechipsproject firrtl 发现firrtl没有执行s
  • android ARouter源码分析

    背景 随着项目越做越大 代码量越来越多 项目也随之改造成组件化的开发模式 组件化开发非常适合庞大的项目 将每个业务模块 功能模块解耦 抽离成组件的形式 各个组件遵循严格的依赖关系 因为这层严格的依赖关系 使得组件化比模块化结构更加简洁和清晰
  • python中objects_python之django的objects.get和objects.filter方法

    为了说明它们两者的区别定义2个models class Student models Model name models CharField 姓名 max length 20 default age models CharField 年龄
  • 实现简单感知机_感知机的原始算法与对偶算法

    一 感知机模型 感知机是一个二分类的线性分类模型 输入为实例的特征向量 输出实例的类别 取1 1两个值 输入判别模型 它适用于线性可分的数据集的分类 所谓线性可分 就是两类数据可以用空间中的一个超平面分离 即存在参数 当 属于其中一类时 当
  • 001:输出第二个整数

    001 输出第二个整数 描述 输入三个整数 把第二个输入的整数输出 输入 只有一行 共三个整数 整数之间由一个空格分隔 整数是32位有符号整数 输出 只有一行 一个整数 即输入的第二个整数 样例输入 123 456 789 样例输出 456
  • cdn.jsdelivr.net访问超时,临时解决方案

    近日在访问https cdn jsdelivr net npm swagger ui dist 4 swagger ui bundle js 时候发现net ERR CONNECTION TIMED OUT 查看官网 发先已有用户提交问题
  • .exe解释

    exe文件 exe就是可执行文件 可执行文件就是程序 qq 浏览器 word等等这些程序其实就是一个个的 exe格式文件 它们和存在电脑里的照片 文档 视频一样 都是一个个文件 只不过格式不一样 word文档是 doc或者 docx格式的
  • 源码安装 nginx/1.15.8 的脚本

    环境是在centos7 下 其他环境还未试过 nginx 的安装路径在 usr local nginx bin bash 一般系统中已经装了了make和g 无须再装 yum y install autoconf automake make
  • 【通讯录--动态实现】

    目录 前言 一 功能设置 声明结构体 1 初始化 2 释放空间 3 添加联系人 4 删除联系人 5 查找联系人 6 修改联系人 7 显示联系人 8 清空联系人 9 排序联系人 二 整体代码 1
  • js的三种使用方式(行内js、内部js、外部js)

    1 行内js js不单独写出
  • 远程VirtualBox上的Linux虚拟机

    项目场景 为了能够隔离实验环境 在VirtualBox上安装了Centos7用来专门跑实验 却发现无法远程 关闭防火墙和SELinux 1 关闭防火墙 2 关闭SELinux getenforce 命令查看是否开启 若为 Enfocing
  • ERP系统设计:库存管理怎么做?

    库存是企业打算出售给客户以获取利润的商品或材料 库存管理是供应链的一个关键要素 涉及到从制造商到仓库 从这些设施到销售点的库存跟踪 库存管理的目标是在适当的时间将适当的产品放置在适当的地点 库存管理的业务问题 在进行库存管理工作时 会出现很
  • 基于Python的大数据分析基础(一)

    关于Pandas Pandas中的数据结构 1 Series 一维数组系列 也称序列 2 DataFrame 二维的表格型数据结构 3 Panel 三维数组 数据类型 1 Logical 逻辑型 2 Numeric 数值型 3 Charac
  • NodeJS简介-node.js是什么?

    Nodejs是个在服务器动可以解析和执行JavaScript代码的运行环境 也可以说是一个运行时平台 仍然使用JavaScript作为开发语言 但是提偶了一些功能性的API 例如文件操作和网络通信API等 Nodejs是由 Ryan Dah
  • ssh key authentication失败,查看日志是selinux禁止了sshd读取authorized_keys文件

    ssh key authentication失败 查看日志是selinux禁止了sshd读取authorized keys文件 May 5 04 24 36 localhost dbus 704 system Activating serv

随机推荐

  • C#的变迁史 - C# 4.0 之线程安全集合篇

    作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题 解决临界资源的访问通常是加锁或者是使用信号量 这个大家应该很熟悉了 而集合作为一种重要的临界资源 通用性更广 为了让大家更安全的使用它们 微软为我们带来了强大的并行集合 Syste
  • 基于堆叠⾃编码器的时间序列预测 深层神经网络

    自适应迭代扩展卡尔曼滤波算法 AIEK 是一种滤波算法 其目的是通过迭代过程来逐渐适应不同的状态和环境 从而优化滤波效果 该算法的基本思路是在每一步迭代过程中 根据所观测的数据和状态方程 对滤波器的参数进行自适应调整 以便更好地拟合实际数据
  • python- NameError name ‘name‘ is not defined

    python NameError name name is not defined 练习写python函数的时候 遇到了NameError name name is not defined 这样的错误 百度了一下 发现name是一个系统变量
  • Selenium+Python系列 - 开发环境搭建

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 设计模式:代理模式

    由于某些原因需要给某对象提供一个代理以控制对该对象的访问 这时 访问对象不适合或者不能直接引用目标对象 代理对象作为访问对象和目标对象之间的中介 这就是代理模式 代理模式的主要优点有 1 代理模式在客户端与目标对象之间起到一个中介作用和保护
  • QT学习:制作树形列表菜单

    一 前言 使用QT制作树形的列表菜单 需要使用QTreeWidget和QTreeWidget两个类 最终效果如图所示 二 代码方式实现 使用代码方式实现树形菜单 首先要包含两个类库 include
  • 安全测试目录内容合集

    基础知识 安全测试基础知识 安全测试 django防御安全策略 HTTP工作原理 靶场DVWA 安全测试网站 DWVA下载安装启动 DVWA Command Injection DVWA 5 File upload 文件上传漏洞 DVWA
  • 【记录】安装Django 创建虚拟环境和新项目

    本文仅记录实际操作情况 本文参考书籍 1 2 1 确保电脑安装Python 2 创建虚拟环境 创建一个新目录test blog 再在终端中切换到这个目录 并执行如下命令创建一个虚拟环境 python m venv ll env 书上原文 这
  • 如何恢复内存卡数据?

    生活中 无论我们使用哪种存储设备 内部空间都是有限的 随着使用时间的增加 里面存储的数据会越来越多 这时如果不能及时处理 将很容易出现数据丢失 如果小伙伴们不小心碰到这样的事 要如何恢复内存卡数据呢 遇到了请不要着急 下面小编就分享可以有效
  • python读取表格画散点图_Note: Python_Matplotlib绘制平滑曲线和散点图

    给出横坐标纵坐标点 即可连线绘图 import matplotlib 调用绘图工具包 给出x y点坐标 x y 1 2 3 4 5 6 5 9 3 4 7 5 绘图 matplotlib pyplot plot x y 这样使用工具包如果程
  • python发邮件附件内容中文乱码_python3发邮件,附件名称为中文时出错

    问题描述 我写了一个发邮件的类 一切进行的很顺利 但是附件名改成中文的时候就出问题了 问题出现的环境背景及自己尝试过哪些方法 用的是python3 和email包 是了MIMEText MIMEApplication MIMEBase都不行
  • java scope_spring中的scope详解

    1 singleton 单一实例 此取值时表明容器中创建时只存在一个实例 所有引用此bean都是单一实例 如同每个国家都有一个总统 国家的所有人共用此总统 而这个国家就是一个spring容器 总统就是spring创建的类的bean 国家中的
  • Flask框架种使用ORM模型对MySQL数据库的管理

    通过flask连接MySQL数据库后 使用ORM模型对数据库管理 ORM模型的优点 使用 ORM 做数据库的开发可以有效的减少重复SQL语句的概率 写出来的模型也更加直观 清晰 支持多个关系数据库引擎 包括流行的 MySQL Postgre
  • mysql使用st_distance_sphere函数报错Incorrect arguments to st_distance_sphere

    最近发现执行mysql st distance sphere报错了 报错的信息是Incorrect arguments to st distance sphere 最开始以为是跟mysql的版本有关系 所以看了下自己本地的mysql版本 执
  • 详解shell输出重定向:>/dev/null 2>&1

    1 输入输出重定向介绍 重定向简单来说就是把本来已经默认的 确定的输入输出给重新定位到你想要的地方 重定向这个概念在C语言中就有 在C语言编程中 标准输出是屏幕 使用printf 函数默认是输出到屏幕显示 但是有时候我们需要将信息输出到文件
  • BOM特效:返回顶部按钮

    BOM特效开发 返回顶部按钮制作 BOM特效开发 返回顶部按钮制作 改变document documentElement scrollTop属性 结合定时器逐步改变此值以动画形式返回顶部 在这里插入代码片
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • STM32学习笔记---TIM_GetFlagStatus和TIM_GetITStatus两个固件库函数的区别

    TIM GetFlagStatus和TIM GetITStatus两个函数的区别 最近结合正点原子基于STM32F103ZET6芯片开发板的触摸按键实验 在对TIM5 CH2捕获状态进行判断时发现利TIM GetFlagStatus和TIM
  • [C++]适配器模式

    适配器模式 Adapter Pattern 是作为两个不兼容的接口之间的桥梁 这种类型的设计模式属于结构型模式 它结合了两个独立接口的功能 github源码路径 https github com dangwei 90 Design Mode
  • Oracle insert all 详解

    文章目录 1 概述 2 insert 的两种形式 2 1 insert first 2 2 insert all 3 数据一致性 同时插入 3 1 验证 insert into 数据不一致 3 2 验证 insert all 数据一致 1