前言:

在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中如何使用这种策略相关推荐

  1. Oracle创建序列,删除序列,得到序列的例子

    序列的创建 create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999; 得到序列的SQL语句 select s ...

  2. 第四章 序列式容器(sequence containers)

    序列式容器(sequence containers) 1.容器的概观与分类 2.vector 3.list 4.deque 5.stack 6.queue 7.heap(隐私表述,implicit r ...

  3. 多位点序列分型_细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法...

    摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...

  4. postgres查询序列_PostgreSQL之序列(Sequence)

    PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器.因此,序列在其他同类型数据库软件中以 autoincrment 值的形式存在.在一张表需要非随机,唯一标实符的场景下,Sequenc ...

  5. python获取MySQL自增ID序列

    数据库insert操作时,某个字段是自增序列如ID,但是想获取这个ID的值是多少,后者把这ID的值作为后续其他sql的参数,那要怎么做呢,其实很简单,可用last_insert_id 要获取MySQL ...

  6. Oracle 序列详解(sequence)

    文章目录 1 概述 2 语法 2.1 授权 2.2 创建序列 2.3 查询.修改.删除 2.4 使用序列 3 扩展 3.1 cache 详解 3.2 cycle 详解 3.3 常用获取序列的工具包 3 ...

  7. oracle 序列 清除,Oracle序列(Sequence)创建、使用、修改、删除

    Oracle序列(Sequence)创建.使用.修改.删除 一: 创建序列: 语法: CREATE SEQUENCE sequence_name [START WITH num] [INCREMENT ...

  8. mysql递增函数_SQL使用序列自动递增

    sql函数 的 SQL使用序列自动递增 序列是一组整数1,2,3,...,以便在需要时生成. 序列经常使用在数据库中,因为很多应用都需要在一个表中的每一行包含一个唯一的值,序列提供了一种简单的方法来生 ...

  9. LeetCode 128. 最长连续序列(Longest Consecutive Sequence)

    题目描述 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1 ...

最新文章

  1. python中execute函数_Python 中的内置函数与模块
  2. 什么是爱?什么是幸福?
  3. 王道计算机考研 数据结构 (排序-上)
  4. cocos2dx标准容器_Cocos2d-x3.0模版容器详解之三:cocos2d::Value
  5. SQL表操作习题4 14~25题 缺20题
  6. CCIE学习(4)——VLAN基础
  7. python中组合框_Tkinter Python中的多个组合框
  8. 控制面板中java设置项如何删除
  9. Android开发之实现图片自动滚动显示标签的ViewPager
  10. 世界上主要BIOS厂家介绍(Phoenix,AMI,Insyde,Byosoft)
  11. c语言中compar的用法,compare 的用法
  12. php初级入门教程_PHP初学者教程
  13. 一份Slide两张表格带你快速了解目标检测
  14. u3d 用php当后端,协成方法的使用 Coroutine
  15. 全网最详细!vue中使用flv.js 播放直播监控视频流
  16. TI运放仿真软件TINA
  17. SpringMVC 之Resolver视图解析器笔记(六)
  18. 牛顿法求解无约束最优化问题
  19. 用计算机升级ipad系统软件,教大家如何在苹果手机iPhone和平板电脑iPad上手动更新应用程序...
  20. 子查询(嵌套查询)——MySQL

热门文章

  1. Xp下的程序编译成linux,Windows XP下硬盘安装Linux系统
  2. php 向上取整_PHP取整方法小总结
  3. 怎么让队友变成绿色的名字_“吃鸡”进入游戏后,发现队友在玩手机,他到底是怎么做到的?...
  4. 厦门大学c语言第七八章作业答案,厦门大学 运筹学 第七、八章作业
  5. 联想y470上三代cpu_AMD三代线程撕裂者首测 单核不再是问题(二)
  6. java中singleton_Singleton是什么,在Java中如何实现
  7. Jsp+Ssm+Mysql实现简单的物流快递管理
  8. 基于JAVA+SpringMVC+MYSQL的校园宿舍管理系统
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习系统
  10. Learning opencv续不足(七)线图像的设计D