MySQL、Oracle批量插入SQL的通用写法
举个例子:
现在要批量新增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的通用写法的更多相关文章
- MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束
最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...
- mysql+ibatis 批量插入
述:相比oracle批量插入,mysql批量插入就简单的多了,mysql支持values后面跟多条数据,进行批量插入,并且主键可以自增,不像oracle会遇到序列问题. 1.建表 CREATE TAB ...
- oracle 批量插入-支持序列自增
1.创建表.序列 -- Create table create table test_batch ( id number not null, name ), account ) ) -- Create ...
- Mysql 如何批量插入百万行测试数据
Mysql 如何批量插入百万行测试数据
- Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
今天利用Mybatis的<for each>标签做oracle的批量插入数据时,发现和MySQL数据库有区别.在此记录下,以防之后再踩坑. 一.批量插入: 1.controller: /* ...
- mybatis在mysql和oracle批量插入不同
两者不同 1,批量插入 2,主键自增 3,分页不同 4,......待补充 批量插入 mysql: <insert id="batchinsertSelective" par ...
- oracle的批量插入sql
insert into persons (id_p, lastname , firstName, city ) values (200,'haha' , 'deng' , 'shenzhen'), ( ...
- Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
Oracle数据库,用mybatic批量插入数据: <insert id="saveBatch" parameterType="io.renren.entity.N ...
- mybatis+oracle批量插入报不符合协议和sql未正确结束
在Java中循环save,需要加useGeneratedKeys="false",否则报错不符合协议 mybatis批量插入,也需要在insert里加入 useGeneratedK ...
随机推荐
- iGuard6.0 — 各适其用的网站防护体系
随着互联网新技术的涌现,网站的架构技术和涉及的资源也日益多样且复杂化.这对网站各类资源的防护工作也提出了更高的挑战和更细粒度的需求. 我们经常碰到的用户真实需求包括: 我的 CMS 制作系统,会不会 ...
- CF19E-Fairy【树形结构,差分】
正题 题目链接:https://www.luogu.com.cn/problem/CF19E 题目大意 给出\(n\)个点\(m\)条边的一张无向图,求有多少条边去掉后可以使得图变成一张二分图. \( ...
- Go变量与基础数据类型
一.基础介绍 Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1.Go 的特性: 跨平台的编译型语 ...
- JavaFx全局快捷键实现(Kotlin)
原文地址: JavaFx全局快捷键实现(Kotlin) | Stars-One的杂货小窝 最近整款工具需要用到全局快捷键,搜集了下网上的资料,发现有个JIntellitype库可以用来实现全局快捷键, ...
- 极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- C 库函数源码
github URL git://sourceware.org/git/glibc.git 码云 URL https://gitee.com/jason.R.xie/glibc.git
- 如何快速体验鸿蒙全新声明式UI框架ArkUI?
HDC2021将于10月22日在东莞松山湖正式开幕,大会将设立Codelab体验专区,超多好玩.有趣的Demo等你体验.想快速入门HarmonyOS?学习HarmonyOS新特性?以下几个Codela ...
- 【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
问题描述 在App Service For Windows的环境中,我们可以通过ArmClient 工具发送POST请求在Web应用的实例中抓取网络日志,但是在App Service For Linu ...
- 微信小程序的支付流程
一.前言 微信小程序为电商类小程序,提供了非常完善.优秀.安全的支付功能 在小程序内可调用微信的API完成支付功能,方便.快捷 场景如下图所示: 用户通过分享或扫描二维码进入商户小程序,用户选择购买, ...
- Java:关于 CAS 笔记
Java:关于 CAS 笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. CAS 底层原理 概念 CAS 的全称是 Compare-And-Swap,它 ...