详解mysql模拟Oracle序列的方案及实例演示

概述众所周知,Oracle一般使用序列来处理主键字段。若需要oracle迁移数据库到mysql,主键方面还是不太好处理。

概述

众所周知,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函数,用来获取下一个可用的自增主键
详解mysql模拟Oracle序列的方案及实例演示

总体结构图

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。';
详解mysql模拟Oracle序列的方案及实例演示

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;
详解mysql模拟Oracle序列的方案及实例演示

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;
详解mysql模拟Oracle序列的方案及实例演示

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;
详解mysql模拟Oracle序列的方案及实例演示

3、调用

调用命令如下:

SELECT func_nextval('xxx');
详解mysql模拟Oracle序列的方案及实例演示


关于oracle自增列用mysql如何去实现就介绍到这了,大家可以自己根据项目需要做一些改造,后面会分享更多mysql方面内容,感兴趣的朋友可以关注下!!

详解mysql模拟Oracle序列的方案及实例演示

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/87924.html

(0)
上一篇 2024-10-10 08:45
下一篇 2024-10-11 08:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信