MySQL和Oracle批量插入SQL的通用写法示例


Posted in MySQL onNovember 17, 2021

举个例子:

现在要批量新增User对象到数据库USER表中

public class User{
    //姓名
    private String name;
    //年龄
    private Integer age;
    //性别
    private Integer sex
}

大部分人对MySQL比较熟悉,可能觉得批量新增的SQL都是这样写,其实并不然。该写法在MySQL中没问题,而在Oracle中,这样写就会报错。

MySQL写法:

INSERT INTO USER 
    (NAME,AGE,SEX)
VALUES
('val1_1', 'val1_2', 'val1_3'),
('val2_1', 'val2_2', 'val2_3'),
('val3_1', 'val3_2', 'val3_3');

Oracle写法:

//多次单条插入
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3');

//批量插入
INSERT ALL
   INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3')
SELECT 1 FROM DUAL;

可以发现Oracle的两种写法都比较的麻烦,批量插入也压根没有减少插入的列名。除此之外,另一个麻烦的事情就是,在企业开发中,一套软件系统可能需要支持多套数据库的,因此这条新增的操作,就得适配两套数据库,维护两套SQL,大大地增加了开发成本。

那么有没有一种通用的写法呢?答案是有的。

通用写法:

INSERT INTO USER (NAME,AGE,SEX)
    select ('val1_1', 'val1_2', 'val1_3') from dual union all
    select ('val2_1', 'val2_2', 'val2_3') from dual union all
    select ('val3_1', 'val3_2', 'val3_3') from dual

这样一来,既简单又能少维护一套SQL,两全其美。

下面是XML文件里各种写法的代码。

<!--MySQL的批量插入-->
<insert id="batchInsertUser" databaseId="mysql">
   INSERT INTO USER 
            (NAME,AGE,SEX)
   VALUES
    <foreach collection="userList" index="index" item="user" separator=",">
            (#{user.name},#{user.age},#{user.sex})
  </foreach>
</insert>
<!--Oracle的批量插入-->
<insert id="batchInsertUser" databaseId="oracle">
  BEGIN
  <foreach collection="userList" index="index" item="user" separator=";">
   INSERT INTO USER 
            (NAME,AGE,SEX)
   VALUES
            (#{user.name},#{user.age},#{user.sex})
  </foreach>
  ;END;
</insert>

仔细观察MySQL和Oracle的写法,因为MySQL支持上述在VALUES后面直接插入多条数据,因此。foreach标签只需要循环遍历出VALUES后面()里的内容即可;而Oracle因为不支持这种写法因此需要循环遍历整个INSERT语句。

<!--通用的批量插入-->
<insert id="batchInsertUser" databaseId="mysql">
   INSERT INTO USER 
            (NAME,AGE,SEX)
  <foreach collection="userList" index="index" item="user" separator="union all">
     SELECT
            (#{user.name},#{user.age},#{user.sex})
     FROM DUAL
  </foreach>
</insert>

总结

到此这篇关于MySQL和Oracle批量插入SQL的通用写法的文章就介绍到这了,更多相关MySQL和Oracle批量插入SQL内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql 如何批量插入数据
Apr 06 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
Mysql数据库命令大全
May 26 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 MySQL
SQL 聚合、分组和排序
Nov 11 #MySQL
SQL基础的查询语句
Nov 11 #MySQL
MySQL之select、distinct、limit的使用
Nov 11 #MySQL
MySQL表类型 存储引擎 的选择
Nov 11 #MySQL
一文带你探究MySQL中的NULL
Nov 11 #MySQL
mysql函数全面总结
Nov 11 #MySQL
MYSQL 运算符总结
Nov 11 #MySQL
You might like
PHP define函数的使用说明
2008/08/27 PHP
支持中文的php加密解密类代码
2011/11/27 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
python引用DLL文件的方法
2015/05/11 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python 多线程串行和并行的实例
2019/02/22 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
C#可否对内存进行直接的操作
2015/02/26 面试题
企业党员公开承诺书
2014/03/26 职场文书
三严三实对照检查材料
2014/09/22 职场文书
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
Python Numpy库的超详细教程
2022/04/06 Python
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技