详解MySQL数据库如何实现类似Oracle的序列?
概述
众所周知,Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的。
不过小编在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等;若需要oracle迁移数据库到mysql,主键方面还是不太好处理。
oracle序列
先介绍下oracle序列方面的内容,在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方或者在实际开发中,比如一个需求表格中的需求ID是唯一主键,都可以用sequence来获取。
首先在用Oracle序列号之前,我们首先得创建一个序列然后就可以通过CURRY、NEXTVAL,获取当前表中的返回sequence的当前值、下一个squence的值。可以通过下面的语句来创建Squence:
create sequence INR_REQUIRMENT_SQUENCE INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10;
Oracle序列的使用,实际上是使用.nextval和.currval伪列。
mysql模拟Oracle序列的方案
Oracle序列的使用,实际上是使用.nextval和.currval伪列,这里我们的思路是:
1、MySQL中新建表并定义一张表sequence,每一行记录就可以作为一个序列,然后在字段上定义当前值、自增规则; 2、定义一个next函数,用来获取下一个可用的自增主键
总体结构图
1、创建sequence表
drop table if exists cm_sequence; create table cm_sequence ( name varchar(50) not null comment '序列的名字,唯一', current_value bigint not null comment '当前的值', increment_value int not null default 1 comment '步长,默认为1', primary key (name) ); alter table cm_sequence comment '公共的序列表,用于为非自增且要求唯一的字段记录和获取唯一ID。';
2、创建3个函数
2.1、func_currval:获取当前序列的值并返回
drop function if exists func_currval; SET GLOBAL log_bin_trust_function_creators = 1; create function func_currval (seq_name varchar(50)) RETURNS integer begin declare value integer; set value = 0; select current_value into value from cm_sequence where name = seq_name; return value; end;
2.2、func_setval:设置当前序列的值并返回
drop function if exists func_setval; create function func_setval (seq_name varchar(50),value integer) RETURNS integer begin update cm_sequence set current_value = value where name = seq_name; return func_currval(seq_name); end;
2.3、func_nextval:获取序列中的一个可用的值
drop function if exists func_nextval; create function func_nextval (seq_name varchar(50)) RETURNS integer contains sql begin update cm_sequence set current_value = current_value + increment_value where name = seq_name; return func_currval(seq_name); end;
3、调用
调用命令如下:
SELECT func_nextval('xxx');
关于oracle自增列用mysql如何去实现就介绍到这了,大家可以自己根据项目需要做一些改造,后面会分享更多mysql方面内容,感兴趣的朋友可以关注下!!
相关推荐
周嘉笙 2020-11-09
zhuzhufxz 2020-09-16
lklong 2020-11-22
oraclemch 2020-11-06
shilukun 2020-10-10
bfcady 2020-08-16
Hody 2020-08-16
FightFourEggs 2020-08-16
数据库设计 2020-08-16
yanghuatong 2020-08-16
dbasunny 2020-08-16
罗罗 2020-08-16
ihuaqiang 2020-08-16
choice0 2020-07-30
娜娜 2020-07-28
solarspot 2020-07-28
踩风火轮的乌龟 2020-07-26
娜娜 2020-07-20
xwb 2020-07-19
娜娜 2020-07-18
流云追风 2020-07-04
dataminer 2020-06-25
娜娜 2020-06-22
zhangchaoming 2020-06-21