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

目录
  • MySQL自定义序列数实现
    • 创建序列表
    • 插入定义的序列
    • 自定义函数实现
    • MyBatis中调用函数来获取最新序列数
  • MySQL添加自定义的序列
    • 使用实例
  • 总结

MySQL自定义序列数实现

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

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

  • 通过原子操作和锁机制使用Java代码实现,在单JVM中维护内存中的序列数,另外需要自己保证持久化到外部存储系统;
  • 或者使用能保证分布式高并发下一致性的组件Zookeeper,借助于它的分布式锁很容易实现,缺点是需要在自己的系统或服务中引入Zookeeper的组件依赖,无疑增加了系统复杂度和可维护性(换用Redis也是同理);
  • 另一种容易想到可以利用MySQL的事务操作,存储过程是可以满足事务性的要求,所以这种方式相比于第一种方式更加轻量。

这里介绍采用自定义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;

总结

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

(0)

相关推荐

  • mysql简单实现查询结果添加序列号的方法

    本文实例讲述了mysql简单实现查询结果添加序列号的方法.分享给大家供大家参考,具体如下: 第一种方法: 复制代码 代码如下: select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it 第二种方法: set @rownum=0; select @rownum:=@rownum+1 as rownum, t.username from auth_user t limit 1,5; 更多关于MySQL相关内容感兴

  • 在MySQL中使用序列的简单教程

    序列是一组整数1,2,3,...中生成的顺序.序列中经常使用的数据库,因为很多应用都需要一个表中的每一行包含一个独特的值和序列提供了一个简单的方法来产生.本章介绍如何使用MySQL中的序列. 使用自动递增列: 在MySQL中使用序列最简单的方法是定义一个AUTO_INCREMENT列,剩下的事情留给MySQL处理. 实例: 试试下面的例子.这将创建表之后,它会在此表中它不是必需的记录ID插入几行,因为它由MySQL自动递增. mysql> CREATE TABLE insect -> ( -&

  • mysql使用自定义序列实现row_number功能(步骤详解)

    看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `name` varchar(10), `subject` varchar(10), `score` int(10) ) 第二步:写入数据 insert into grades(name, subject, score) values('小明', '语文', 85), ('小华', '语文', 89), (

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

    目录 MySQL自定义序列数实现 创建序列表 插入定义的序列 自定义函数实现 MyBatis中调用函数来获取最新序列数 MySQL添加自定义的序列 使用实例 总结 MySQL自定义序列数实现 往往有很多情况下,我们需要使用自己生成的唯一Id或保证不重复的序列号,特别是在高并发的场景下. 为此,很容易想到的实现方式有以下几种: 通过原子操作和锁机制使用Java代码实现,在单JVM中维护内存中的序列数,另外需要自己保证持久化到外部存储系统: 或者使用能保证分布式高并发下一致性的组件Zookeeper

  • Mysql 自定义随机字符串的实现方法

    前几天在开发一个系统,需要用到随机字符串,但是mysql的库函数有没有直接提供,就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时. 1.简单粗暴. select ..., substring(MD5(RAND()),floor(RAND()*26)+1,6) as rand_str ..... 上诉示例产生的是:6位长度的随机字符串. 函数解释: rand() :产生 0-1之间的小数,简称种子.rand()*25 产生的数 在 0- 25 之间,不包括25 floor(va

  • MySQL 自定义变量的概念及特点

    MySQL 的自定义 就是存储值的临时容器,只要与服务端的连接是活跃的,容器中的值可以保存和使用.可以通过简单的 SET 或 SELECT语句 设置自定义变量,如下所示: SET @one := 1: SET @min_actor := (SELECT MIN(actor_id) FROM sakila.actor); SET @last_week := CURRENT_DATE-INTERNAL 1 WEEK; 定义好变量后,就可以在 SQL 语句中使用这个变量: SELECT * FROM

  • MySQL自定义函数及触发器

    目录 1. 存储函数(自定义函数) 1.1 定义存储函数 1.2 调用存储函数 1.3 删除存储函数 2. 触发器 2.1 触发器介绍 2.2 创建触发器 2.3 删除触发器 2.4 查看触发器 1. 存储函数(自定义函数) 自定义函数是一种对MySQL扩展的途径,其用法与内置的函数相同. 定义函数的两个必要条件:参数.返回值.函数可以返回任意类型的值,同样可以接收这些类型的参数. 关于函数体: 函数体是由合法的SQL语句构成. 函数体可以是简单的SELECT或INSERT语句. 函数体如果为符

  • python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

  • 浅谈mysql 自定义函数

    因为工作需要,要写一个mysql的自定义行数,如下 DELIMITER $$ DROP FUNCTION IF EXISTS `onlineFunction`$$ CREATE FUNCTION `onlineFunction`(rrrr VARCHAR(50)) RETURNS VARCHAR(255) BEGIN IF(rrrr='online') THEN RETURN '上线';END IF; END$$ DELIMITER ; 第一行DELIMITER 定义一个结束标识符,因为MySQ

  • MySQL服务器线程数的查看方法详解

    本文实例讲述了MySQL服务器线程数的查看方法.分享给大家供大家参考,具体如下: mysql重启命令: /etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行.Threads_created表示创建过的线程数,通过查看Threads_created就可以查看MySQL服务器的进程状态. mysql> show global status like 'Thread%'; +------------------

  • MySQL自定义函数和存储过程示例详解

    前言 本文主要给大家介绍的是关于MySQL自定义函数和存储过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--

  • mysql 数据库备份的多种实现方式总结

    本文实例讲述了mysql 数据库备份的多种实现方式.分享给大家供大家参考,具体如下: 一.使用mysqldump进行备份 1.完整备份所有数据库 mysqldump -u root -p --all-databases > E:/all.sql 在mysql8之前,存储过程和事件存储在mysql.proc和mysql.event表中. 从mysql8开始,相应对象的定义存储在数据字典中,这些表不会被备份. 要将存储过程和事件也包含,请使用如下语句: mysqldump -u root -p --

随机推荐