mysql实现自定义sequence自增序列

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 mysql实现自定义sequence自增序列,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

mysql数据库没有oracle数据库中sequence序列,mysql中只有auto_increment自增,这种自增方式只能是整数类型的,如果要自定义的自增序列,mysql就不能实现。

这里,提供mysql实现自定义sequence自增序列的一种方法。

(1)创建一个自增序列表

DROP TABLE IF EXISTS sequence;
-- 创建序列表
CREATE TABLE IF NOT EXISTS sequence (
	sequence_name VARCHAR(50) PRIMARY KEY COMMENT '序列名称',
	current_value INT NOT NULL COMMENT '序列当前值',
	increment INT NOT NULL DEFAULT '1' COMMENT '序列步长',
	sequence_date VARCHAR(10) NOT NULL COMMENT '日期'
) COMMENT '序列表';

(2)创建currval方法,用于获取当前序列值

DROP FUNCTION IF EXISTS currval;
DELIMITER $$
CREATE FUNCTION currval(seq_name VARCHAR(50))
RETURNS INTEGER
BEGIN
  DECLARE cur_value INTEGER DEFAULT 0;
  -- 查询是否存在当前序列
  SELECT count(1) INTO cur_value FROM sequence 
  WHERE sequence_name = seq_name 
    AND sequence_date = DATE_FORMAT(SYSDATE(),'%Y%m%d');
  IF cur_value <> 0 THEN
    -- 存在则返回当前序列值
	SELECT current_value INTO cur_value FROM sequence
     WHERE sequence_name = seq_name 
       AND sequence_date = DATE_FORMAT(SYSDATE(),'%Y%m%d');
  ELSE 
    -- 删除不是当天的序列
    DELETE FROM sequence WHERE sequence_name = seq_name;
    -- 不存在,则插入当前序列值
	INSERT INTO sequence(sequence_name, current_value, increment, sequence_date) 
    VALUES(seq_name, 0, 1, DATE_FORMAT(SYSDATE(),'%Y%m%d'));
  END IF;
  RETURN cur_value;
END $$;

(3)创建nextval方法,用于获取下一个序列值

DROP FUNCTION IF EXISTS nextval;
DELIMITER $$
CREATE FUNCTION nextval(seq_name VARCHAR(50))
RETURNS VARCHAR(32)
BEGIN
  DECLARE curVal INTEGER;
  -- 获取当前序列值
  SET curVal = currval(seq_name);
  -- 更新序列表
  UPDATE sequence SET current_value = current_value + increment 
  WHERE sequence_name = seq_name 
    AND sequence_date = DATE_FORMAT(SYSDATE(),'%Y%m%d');
  -- 返回序列,格式:xxxx+20210220+8位长度序列(不足左补0)
  RETURN CONCAT(seq_name, DATE_FORMAT(SYSDATE(), '%Y%m%d'),LPAD(curVal,8,0));
END $$;

(4)测试结果

select nextval('test');
select nextval('test');
select nextval('test');

运行结果如下(每调用nextval方法一次,就会返回一个序列):

mysql实现自定义sequence自增序列

以上就是一个自定义自增序列的实现方式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134804.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!