ITPub博客

首页 > 数据库 > MySQL > mysql部分实现类似oracle sequence功能的测试

mysql部分实现类似oracle sequence功能的测试

MySQL 作者:ilsyx 时间:2022-04-14 22:05:29 0 删除 编辑

在文章 《mysql实现sequence功能的代码》 更新时间:2019年03月14日 11:06:11   作者:江上一叶舟   基础之上进行的实验完善。在mysql数据库上实现oracle 循环sequence功能。

mysql 操作版本mysql 8.0.28


-- 1.建立sequence记录表

drop table crm_sequence;
CREATE TABLE crm_sequence (
 seq_name varchar(64)  NOT NULL,
 min_value int NOT NULL,
 max_value int NOT NULL,
 current_value int NOT NULL,
 increment_value int NOT NULL DEFAULT '1',
 PRIMARY KEY (seq_name)
) ENGINE=InnoDB ;


-- 2.建立_nextval函数,循环使用sequence

drop FUNCTION _nextval;

DELIMITER $$
CREATE FUNCTION _nextval(name varchar(64)) RETURNS int
DETERMINISTIC
begin
declare _cur int;
declare _maxvalue int; -- 接收最大值
declare _increment int; -- 接收增长步数
set _increment = (select increment_value from crm_sequence where seq_name = name);
set _maxvalue = (select max_value from crm_sequence where seq_name = name);
set _cur = (select current_value from crm_sequence where seq_name = name);
if(_cur + _increment >= _maxvalue) then -- 判断下一值是否达到最大值,达到则重置当前值为最小值
   update crm_sequence
    set current_value = min_value
    where seq_name = name ;
else
    update crm_sequence           -- 以指定步长更新当前值
    set current_value = _cur + increment_value
    where seq_name = name ;
end if;
set _cur = (select current_value from crm_sequence where seq_name = name);
return _cur;
end$$
DELIMITER ;

-- 3. 建立_currval函数,获取sequence当前值
drop FUNCTION _currval;

DELIMITER $$
CREATE FUNCTION _currval(name varchar(64)) RETURNS int
DETERMINISTIC
begin
declare _cur int;
set _cur = (select current_value from crm_sequence where seq_name = name);
return _cur;
end$$
DELIMITER ;


-- 4.向crm_sequence表中新建想要的sequnce

INSERT INTO crm_sequence
(seq_name,
min_value,
max_value,
current_value,
increment_value)
VALUES
('business_group_id', 1, 99999999, 1, 1);

-- 5.使用样例,使用sequence
select _currval('business_group_id');
select _nextval('business_group_id');
select _currval('business_group_id');


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11780477/viewspace-2887181/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-12

  • 博文量
    203
  • 访问量
    662405