MySQL自定义序列数的实现方式
作者:DayDayUp丶 发布时间:2024-01-14 00:09:50
标签: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;
来源:https://blog.csdn.net/songzehao/article/details/102900940
0
投稿
猜你喜欢
- 大家都在关注视觉的盛宴,西方的美学;今天就分享下,中国最为古老的美,也是身边随处可见的美学–中国汉字书法之美;古文者,仓颉做造也。仰观奎星园
- 本文主要研究的是Django中migrate和makemigrations的差别,具体如下。在你改动了 model.py的内容之后执行下面的
- codecs在读取文件时,发生错误:UnicodeDecodeError: 'utf-8' codec can't
- 题目:1. 利用拉格朗日乘子法#导入sympy包,用于求导,方程组求解等等from sympy import * #设置变量x1 = sym
- python-opencv 中值滤波{cv2.medianBlur(src, ksize)}中值滤波将图像的每个像素用邻域 (以当前像素为中
- 目的:是学习python 多线程的工作原理,及通过抓取400张图片这种IO密集型应用来查看多线程效率对比import requestsimp
- 使用 pyInstaller 将 python 程序生成可直接运行的程序,这个exe程序就可以在Windows 或 Ma
- 使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现:下载包:paramikoimport paramiko#服务器
- 如下所示:import urllib,json,requestsurl = 'http://127.0.0.1:8000/accou
- EdgePool简介EdgePool是一种用于图分类的卷积神经网络(Convolutional Neural Network,CNN)模型。
- 相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突 * 况下就能快速地
- 偶尔写写Perl脚本,用Eclipse打开太慢,NotePad吧,色彩又太单调了,NotePad++无疑是不一个不错的选择,但当要输入中文注
- 在Python中,字典是通过散列表或说哈希表实现的。字典也被称为关联数组,还称为哈希数组等。也就是说,字典也是一个数组,但数组的索引是键经过
- 前言通常执行 python 程序要有相应的 Python 环境,但某些特定场景下,我们可能并不愿意这么麻烦的去配置这些环境(比如将写好的脚本
- 一. 如何调用def f1(arg1, arg2): print('f1', arg1, arg2)def f2
- 本文实例为大家分享了python实现电子书翻页的具体代码,供大家参考,具体内容如下1.题目:电子书翻页:(1)自动翻页:每次默认读三行,读完
- 如下所示:import matplotlib.pyplot as pltimport numpy as npimport mathdef g
- 本文实例讲述了Python实现更改图片尺寸大小的方法。分享给大家供大家参考,具体如下:1、PIL包推荐Pillow 。2、源码:#encod
- 最近将Pytorch程序迁移到GPU上去的一些工作和思考环境:Ubuntu 16.04.3Python版本:3.5.2Pytorch版本:0
- W3C发布了WCAG 2.0提案(Web Content Accessibility Guidelines 网页内容无障碍指南),大概为了实