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方法一次,就会返回一个序列):
以上就是一个自定义自增序列的实现方式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134804.html