在文章 《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/ ,如需转载,请注明出处,否则将追究法律责任。