mysql序列 mybatis_MySQL实现序列(Sequence)效果以及在Mybatis中如何使用这种策略
前言:
在oracle中一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长、开始索引、是否循环等。最重要的是一张表只能设置一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值
一 MySQL中序列的实现
(1)新建一个测试表:DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
`author` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article
-- ----------------------------
INSERT INTO `article` VALUES (‘1‘, ‘程序猿的自我修养‘, ‘zifangsky‘);
注意,这里并没有设置主键自增
(2)添加序列表并添加测试数据:DROP TABLE IF EXISTS `sequence`;
CREATE TABLE `sequence` (
`seq_name` varchar(50) NOT NULL,
`current_val` int(11) NOT NULL,
`increment_val` int(11) NOT NULL DEFAULT ‘1‘,
PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of board_event_success
-- ----------------------------
INSERT INTO `sequence` VALUES (‘seq_article‘, ‘0‘, ‘1‘);“seq_name”字段表示一个表的的序列,起名最好跟表的名字相关,并且每个表一条数据
“current_val”字段表示“seq_name”字段所对应的表的当前最大ID(主键ID)
“increment_val”字段表示“seq_name”字段所对应的表的主键ID增长的步长(也就是每次自增+1、+2等)
(3)创建一个用于获取一个表当前最大ID的函数:DROP FUNCTION IF EXISTS `currval`;
DELIMITER ;;
CREATE FUNCTION `currval`(v_seq_name VARCHAR(50)) RETURNS int(11)
begin
declare value integer;
set value = 0;
select current_val into value from sequence where seq_name = v_seq_name;
return value;
end
;;
DELIMITER ;
从代码可以看出,这个函数的逻辑很简单,就是根据“seq_name”查询“sequence”这个表的“current_val”这个字段的值
测试:mysql> select currval(‘seq_article‘);
很显然,现在输出为0
(4)创建一个用于获取一个表下一个ID的函数:DROP FUNCTION IF EXISTS `nextval`;
DELIMITER ;;
CREATE FUNCTION `nextval`(v_seq_name VARCHAR(50)) RETURNS int(11)
begin
update sequence set current_val = current_val + increment_val where seq_name = v_seq_name;
return currval(v_seq_name);
end
;;
DELIMITER ;
这个函数的逻辑也很简单,先是更新“sequence”这个表中的某一个表的序列值,然后再次查询该序列值作为插入数据时的主键ID
测试:mysql> select nextval(‘seq_article‘);
很显然,执行这个函数的结果是1,同时“sequence”这个表中的对应的记录也增加了1
二 Mybatis中的序列使用
使用插件生成一个表对应的Mapper.xml文件时需要修改其生成策略,具体来说就是修改generatorConfig.xml文件,修改一个表的基本数据的生成策略:
然后运行插件,最后我们可以看到生成的insert方法是这样的:
select nextval(‘seq_article‘);
insert into article (id, name, author
)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{author,jdbcType=VARCHAR}
)
也就是说使用Mybatis插入数据时,它先是通过 nextval 函数查出待插入数据的主键ID之后,再进行数据的插入
注:关于mybatis自动生成基本文件的插件的使用可以参考我的这篇文章:https://www.zifangsky.cn/431.html
参考文章:
原文:http://983836259.blog.51cto.com/7311475/1889590
mysql序列 mybatis_MySQL实现序列(Sequence)效果以及在Mybatis中如何使用这种策略相关推荐
- Oracle创建序列,删除序列,得到序列的例子
序列的创建 create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999; 得到序列的SQL语句 select s ...
- 第四章 序列式容器(sequence containers)
序列式容器(sequence containers) 1.容器的概观与分类 2.vector 3.list 4.deque 5.stack 6.queue 7.heap(隐私表述,implicit r ...
- 多位点序列分型_细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法...
摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...
- postgres查询序列_PostgreSQL之序列(Sequence)
PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器.因此,序列在其他同类型数据库软件中以 autoincrment 值的形式存在.在一张表需要非随机,唯一标实符的场景下,Sequenc ...
- python获取MySQL自增ID序列
数据库insert操作时,某个字段是自增序列如ID,但是想获取这个ID的值是多少,后者把这ID的值作为后续其他sql的参数,那要怎么做呢,其实很简单,可用last_insert_id 要获取MySQL ...
- Oracle 序列详解(sequence)
文章目录 1 概述 2 语法 2.1 授权 2.2 创建序列 2.3 查询.修改.删除 2.4 使用序列 3 扩展 3.1 cache 详解 3.2 cycle 详解 3.3 常用获取序列的工具包 3 ...
- oracle 序列 清除,Oracle序列(Sequence)创建、使用、修改、删除
Oracle序列(Sequence)创建.使用.修改.删除 一: 创建序列: 语法: CREATE SEQUENCE sequence_name [START WITH num] [INCREMENT ...
- mysql递增函数_SQL使用序列自动递增
sql函数 的 SQL使用序列自动递增 序列是一组整数1,2,3,...,以便在需要时生成. 序列经常使用在数据库中,因为很多应用都需要在一个表中的每一行包含一个唯一的值,序列提供了一种简单的方法来生 ...
- LeetCode 128. 最长连续序列(Longest Consecutive Sequence)
题目描述 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1 ...
最新文章
- python中execute函数_Python 中的内置函数与模块
- 什么是爱?什么是幸福?
- 王道计算机考研 数据结构 (排序-上)
- cocos2dx标准容器_Cocos2d-x3.0模版容器详解之三:cocos2d::Value
- SQL表操作习题4 14~25题 缺20题
- CCIE学习(4)——VLAN基础
- python中组合框_Tkinter Python中的多个组合框
- 控制面板中java设置项如何删除
- Android开发之实现图片自动滚动显示标签的ViewPager
- 世界上主要BIOS厂家介绍(Phoenix,AMI,Insyde,Byosoft)
- c语言中compar的用法,compare 的用法
- php初级入门教程_PHP初学者教程
- 一份Slide两张表格带你快速了解目标检测
- u3d 用php当后端,协成方法的使用 Coroutine
- 全网最详细!vue中使用flv.js 播放直播监控视频流
- TI运放仿真软件TINA
- SpringMVC 之Resolver视图解析器笔记(六)
- 牛顿法求解无约束最优化问题
- 用计算机升级ipad系统软件,教大家如何在苹果手机iPhone和平板电脑iPad上手动更新应用程序...
- 子查询(嵌套查询)——MySQL
热门文章
- Xp下的程序编译成linux,Windows XP下硬盘安装Linux系统
- php 向上取整_PHP取整方法小总结
- 怎么让队友变成绿色的名字_“吃鸡”进入游戏后,发现队友在玩手机,他到底是怎么做到的?...
- 厦门大学c语言第七八章作业答案,厦门大学 运筹学 第七、八章作业
- 联想y470上三代cpu_AMD三代线程撕裂者首测 单核不再是问题(二)
- java中singleton_Singleton是什么,在Java中如何实现
- Jsp+Ssm+Mysql实现简单的物流快递管理
- 基于JAVA+SpringMVC+MYSQL的校园宿舍管理系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习系统
- Learning opencv续不足(七)线图像的设计D