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 22 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
linux下导入、导出mysql数据库命令的实现方法
May 26 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
Mysql数据库group by原理详解
Jul 07 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
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
JQuery 常用操作代码
2010/03/14 Javascript
Jquery ui css framework
2010/06/28 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
javascript实现日历效果
2019/06/17 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
python爬取NUS-WIDE数据库图片
2016/10/05 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python模拟三级菜单效果
2017/09/11 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
Python解析json代码实例解析
2019/11/25 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
医药大学生求职简历的自我评价
2013/10/17 职场文书
给校长的建议书范文
2015/09/14 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
JavaScript实现登录窗体
2021/06/22 Javascript
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python