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 05 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
DQL数据查询语句使用示例
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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php字符集转换
2017/01/23 PHP
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
js实现分页功能
2017/05/24 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
在vue中使用G2图表的示例代码
2019/03/19 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
详解vue路由
2020/08/05 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python jieba库用法及实例解析
2019/11/04 Python
pytorch梯度剪裁方式
2020/02/04 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
小学门卫岗位职责
2013/12/17 职场文书
车间机修工岗位职责
2014/02/28 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
商品陈列协议书
2014/09/29 职场文书
关于学习的决心书
2015/02/05 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书