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 sql_mode修改不生效的原因及解决
May 07 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
Mysql数据库group by原理详解
Jul 07 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 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大转盘中奖概率算法实例
2014/10/21 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
js创建对象的方式总结
2015/01/10 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Python数据集切分实例
2018/12/08 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
少先队活动总结
2014/08/29 职场文书
七一建党日演讲稿
2014/09/05 职场文书
个人收入证明模板
2014/09/18 职场文书
升学宴来宾致辞
2015/07/27 职场文书
教学反思怎么写
2016/02/24 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA