文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL自定义序列数的实现方式

2022-12-28 12:00

关注

MySQL自定义序列数实现

往往有很多情况下,我们需要使用自己生成的唯一Id或保证不重复的序列号,特别是在高并发的场景下。

为此,很容易想到的实现方式有以下几种:

这里介绍采用自定义MySQL序列数的方式来生成唯一Id。

创建序列表

DROP TABLE
  IF EXISTS sequence;
CREATE TABLE
  sequence
  (
    name VARCHAR(50) NOT NULL,
    current_value BIGINT NOT NULL,
    increment INT NOT NULL DEFAULT 1,
    PRIMARY KEY (name)
  )
  ENGINE=InnoDB;

插入定义的序列

INSERT INTO sequence VALUES ('seq1', 0, 1);
INSERT INTO sequence VALUES ('seq2', 0, 1);
...

自定义函数实现

DROP FUNCTION IF EXISTS `seq`; 
DELIMITER $$ 
CREATE FUNCTION `seq`(seq_name char (20)) returns BIGINT
BEGIN
 UPDATE sequence SET current_value=last_insert_id(current_value + increment) WHERE name=seq_name;
 RETURN last_insert_id();
END $$
DELIMITER ;

MyBatis中调用函数来获取最新序列数

<select id="getRowkeyByName" parameterType="java.lang.String" resultType="long">
  select `seq`(
    #{name}
  )
</select>

MySQL添加自定义的序列

MySQL中也能使用序列,而不是字段的自增长

其实就是自己维护一个表

use aglog;
 
-- 创建公共的序列表
DROP TABLE IF EXISTS t_common_sequence;
CREATE TABLE t_common_sequence (
  seq_name VARCHAR(100) NOT NULL COMMENT '序列名称',
  current_val INT NOT NULL COMMENT '当前值',
  increment_val INT NOT NULL DEFAULT '1' COMMENT '增长值 默认1',
  PRIMARY KEY(seq_name)
)
ENGINE = InnoDB
CHARACTER SET = utf8
COMMENT='公共的序列表';
 
-- 创建函数,获取指定名称的 当前序列值
DELIMITER //
DROP FUNCTION IF EXISTS f_currval;
CREATE FUNCTION f_currval(v_seq_name VARCHAR(100))
RETURNS INT
BEGIN
  DECLARE value INT;
  SET value = 0;
  SELECT current_val into value 
  FROM t_common_sequence
  WHERE seq_name = v_seq_name;
  RETURN value;
END;
//
DELIMITER ;
 
-- 创建函数,获取指定名称的 下一个序列值
DELIMITER //
DROP FUNCTION IF EXISTS f_nextval;
CREATE FUNCTION f_nextval(v_seq_name VARCHAR(100))
RETURNS INT
BEGIN
  UPDATE t_common_sequence
  SET current_val = current_val + increment_val
  WHERE seq_name = v_seq_name;
  RETURN f_currval(v_seq_name);
END;
//
DELIMITER ;
 
-- 创建函数,修改指定名称的序列值,并返回
DELIMITER //
DROP FUNCTION IF EXISTS f_setval;
CREATE FUNCTION f_setval(v_seq_name VARCHAR(100), v_new_val INT)
RETURNS INT
BEGIN
  UPDATE t_common_sequence
  SET current_val = v_new_val
  WHERE seq_name = v_seq_name;
  RETURN f_currval(v_seq_name);
END;
//
DELIMITER ;

使用实例

insert into t_common_sequence(seq_name,current_val,increment_val) values('seq_job',1,1);
commit;
 
 
-- 获取当前序列
select f_currval('seq_job');
 
-- 获取下一个序列
select f_nextval('seq_job');
 
-- 设置序列值,并返回
select f_setval('seq_job',10);
 
select * from t_common_sequence;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯