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
数据库连接池
Apr 06 MySQL
MySQL Shell的介绍以及安装
Apr 24 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
mysql查看表结构的三种方法总结
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
PHP 编程安全性小结
2010/01/08 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
JavaScript 学习初步 入门教程
2010/03/25 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python版大富翁源代码分享
2018/11/19 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
外语系毕业生自荐信范文
2013/12/16 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
小区消防演习方案
2014/02/21 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
《检阅》教学反思
2016/02/22 职场文书
担保书范文
2019/07/09 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers