H2数据库用来做单测数据库,可以自定义初始化数据,不用担心数据库内容更改造成单测跑不过问题,不过H2数据库跟实际使用的Mysql还是有一定区别。

1. H2数据库不支持Mysql的批量更新功能,支持批量插入

--批量更新(H2不支持)
<update id="increaseBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update product
<set>
quantity = quantity + #{item.updateQuantity}, modify_time = #{item.modifyTime}
</set>
where id = #{item.productId}
</foreach>
</update> --批量插入(H2支持)
<insert id="insertItems" keyProperty="id" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey keyProperty="id" order="AFTER" resultType="long">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO bill_item(
bill_id,product_id,product_name,product_quantity,product_quantity_after,product_price,product_amount)
VALUES
<foreach close="" collection="list" index="index" item="item" open="" separator=",">
(
#{item.billId},#{item.productId},#{item.productName},#{item.productQuantity},
#{item.productQuantityAfter},#{item.productPrice},#{item.productAmount})
</foreach>
</insert>

2. H2数据库不支持Mysql的replace into 语法

3. H2数据库初始化时不允许出现相同的UK

    <jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:H2_TYPE.sql"/>
<jdbc:script location="classpath:INIT_TABLE.sql"/>
<jdbc:script location="classpath:INIT_DATA.sql"/>
</jdbc:embedded-database>

INIT_TABLE.sql

-- 表A
CREATE TABLE `table_A` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`bill_no` varchar(45) DEFAULT NULL COMMENT '单号',
`bill_type` tinyint(4) unsigned NOT NULL DEFAULT '' COMMENT '单据类别',
`created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; --表A
CREATE TABLE `table_B` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`bill_no` varchar(45) DEFAULT NULL COMMENT '单号',
`bill_type` tinyint(4) unsigned NOT NULL DEFAULT '' COMMENT '单据类别',
`created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

运行结果:

Caused by: org.h2.jdbc.JdbcSQLException: Constraint "uk_bill_type_bill_no" already exists;
SQL statement:CREATE TABLE `table_B` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`bill_no` varchar(45) DEFAULT NULL COMMENT '单号',
`bill_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '单据类别',
`created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

H2数据库做单测数据库时踩到的坑的更多相关文章

  1. [问题解决]RedHat7更换CentOS7的yum源时踩过的坑

    更换yum源的流程 查看当前yum程序 $ rpm -qa|grep yum 这里推荐将其结果截屏或拷贝出来,以免后面报错修复. 删除原有yum源 $ rpm -aq | grep yum|xargs ...

  2. 使用Ajax中get请求发送Token时踩的那些坑

    在使用惯了各种牛X的插件以后,在使用原生组件写一些小东西的时候总是有踩不完的坑! 今天就来说一说我使用原生ajax请求时踩得坑: 下面是我的代码: var xmlhttp; if (window.XM ...

  3. 互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

    上篇博文中,我们介绍了做互联网级监控系统的必备-Influxdb的关键特性.数据读写.应用场景: 互联网级监控系统必备-时序数据库之Influxdb 本文中,我们介绍Influxdb数据库集群的搭建, ...

  4. 那些年我用awk时踩过的坑——awk使用注意事项

    由于项目经历原因,经常使用awk处理一些文本数据.甚至,我特意下载了一个windows上的awk:gawk.exe,这样在windows上也能享受awk处理数据的方便性,. 俗话说,"常在河 ...

  5. 曲演杂坛--使用CTE时踩的小坑:No Join Predicate

    在一次系统优化中,意外发现一个比较“坑”的SQL,拿出来供大家分享. 生成演示数据: --====================================== --检查测试表是否存在 IF(O ...

  6. 前端开发工具Brackets介绍,安装及安装Emme插件时踩过的坑

    对于前端开发的园友来说有可能IDE工具有很多,层次不穷,还有每个人的喜好及习惯也不一样,因为我是一名后端开发的.Net程序员,但是大家都知道,现在都提倡什么全栈工程师,所以也得会点前端开发,所以我对于 ...

  7. 在做zabbix分布式监控时遇到的各种坑

    因为公司在用zabbix的时候需要用到zabbix-proxy,所以今天就在三台虚拟机上做了测试: 环境:zabbix-server端:centos6.8 上面安装了zabbix-server.zab ...

  8. python与C,在写程序时踩过的坑!

    1.  python与C有很多相似之处, 其一就是指针的大量应用,  因此在使用临时变量保存数据, 并将临时变量传递给其他变量时需要创建内存; 例如,在C中, char *temp 每次获取到不同的字 ...

  9. [转] 那些在使用webpack时踩过的坑

    用webpack的过程,就是一个不断入坑和出坑的过程.回望来时路,一路都是坑啊!现把曾经趟过的那些坑整理出来,各位看官有福了~ 文章末尾有我用到的依赖的版本信息,若你发现某个问题与我在本文中的描述不一 ...

随机推荐

  1. HTML基础 img标签 做一个图库

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Windows 搭建MongoDB分片集群(一)

    一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即存储实际数据得分片,每个shard 可以是一个Mongod实例,也可以是一组mongod实例构成得Repl ...

  3. APPScan安全测试工具

    1.下载IBM Security AppScan Standard.rar免费版,下载地址:https://www.cr173.com/soft/820147.html,安装完成后,配置扫描配置提示无 ...

  4. vue内置组件——transition简单原理图文详解

    基本概念 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animate.css 在过渡 ...

  5. python处理文件某行的固定位置

    1.打开文件 2.按行循环 3.处理固定行 with open('file/Aa.txt') as f: for line in f: print(line[2:12]) 可以这样处理的原因是,lin ...

  6. Spring---Spring Aware

    1.概述 1.1.Spring中的  所有Bean  对Spring容器的存在  是没有意识的(即你可以将容器换成别的容器,这样使用容器与Bean之间的耦合度很低): 但在实际项目中,不可避免的要用到 ...

  7. "sorted()"中的"Key Functions"

    Pythonsorted()函数中可以加入key=<FUNCTION>参数.作用是每个元素在排序之前,先作为key=<FUNCTION>中FUNCTION的参数,用FUNCTI ...

  8. java编程实战

    线程池为什么要有它: 线程创建要开辟虚拟机栈,释放线程要垃圾回收的. server端要并发访问数据库的. 服务器启动有线程池放着. ----- 线程池的概念: 1.任务队列 2.拒绝策略(抛出异常,直 ...

  9. vue.js 导出JSON

    cnpm install file-saver --save <template> <div class="hello"> <button @clic ...

  10. boost bimap

    The library Boost.Bimap is based on Boost.MultiIndex and provides a container that can be used immed ...