mysql数据库做流水号

栏目: IT技术 · 发布时间: 5年前

内容简介:需要生成一个按某个种子生成流水号,这个种子目前是时间维度,比如2020年7月1日生成流水号从0开始一直向后递增1,无论2020年7月1日最终流水号生成多少,2020年7月2日生成流水号依然从0开始重新计数。1.考虑redis自增数据虽然这是常用方案,不过我们为了简化架构,redis组件增加后只用作获取自增序列这一个功能,有点大材小用了,所以暂不考虑这个方案。

需求

需要生成一个按某个种子生成流水号,这个种子目前是时间维度,比如2020年7月1日生成流水号从0开始一直向后递增1,无论2020年7月1日最终流水号生成多少,2020年7月2日生成流水号依然从0开始重新计数。

方案

1.考虑 redis 自增数据

虽然这是常用方案,不过我们为了简化架构,redis组件增加后只用作获取自增序列这一个功能,有点大材小用了,所以暂不考虑这个方案。

2.考虑数据库sequence序列

mysql没有sequence功能,这个确实有点坑。

3.使用数据库的auto_increment自增

drop table test;
CREATE TABLE test (
  id varchar(64) not null primary key,
  my_id INT AUTO_INCREMENT NOT NULL unique,
  name VARCHAR(10) NOT NULL
);
insert into test(id,my_id,`name`) values (UUID(),null,'abc')

这个方案确实可以,不过有个弊端,就是不支持种子,也就是当我切换name的时候,计数器并不会重新计数。

4.使用数据库last_insert_id方法

这个方法是基于方案3给出的方法,方案3是每次插入业务数据时,这条数据上新增一列作为自增列,插入后,我们可以使用last_insert_id获取到my_id这一列的值。

那么我们是否可以使用单独一张表来计数,这样是否可以使用种子了呢?答案是否定的。

例如方案3中给出的test表是独立的表,name只是作为种子存在,插入数据时拿到last_insert_id,就是上一次插入的my_id了,不过last_insert_id只能获取到insert数据,对于update的数据是拿不到的,所以如果单独一张表来记录计数,依然要用insert方法,又回到方案3的问题了,没有种子。

5.使用结合方式

使用单独计数表+function来实现,网上大部分给出的方案也是这个方法,不过写的比较乱,我在这里总结一下:

CREATE TABLE tb_sequence ( NAME VARCHAR ( 50 ) NOT NULL, current_value INT NOT NULL, _increment INT NOT NULL DEFAULT 1, PRIMARY KEY ( NAME ) );

DELIMITER //
CREATE FUNCTION _nextval ( n VARCHAR ( 50 ) ) RETURNS INTEGER BEGIN
DECLARE
		_cur INT;
	SET _cur = ( SELECT current_value FROM tb_sequence WHERE NAME = n );
	IF
		_cur IS NULL THEN
			INSERT INTO tb_sequence
		VALUES
			( n, 1, 1 );
		SET _cur = 1;
	END IF;
	UPDATE tb_sequence 
	SET current_value = _cur + _increment 
	WHERE
		NAME = n;
	RETURN _cur;
	END;
// 
SELECT _nextval ( 'test' );

在select _nextval(‘seed’)是,把seed作为种子,如果不存在,就在计数表里插入一条数据,如果存在,则直接+1返回,所以以后每次取值时,可以用一个function就搞定了。

结论

网上有很多文章讲述方案5的,我只是个搬运工,并稍微改动了一下,也避免以后找不到了,供大家参考。

针对这个例子还有很多可扩展的方法,可以修改得更通用,更容易扩展,我就不做赘述了,有更好方案的小伙伴请在下方留言。


以上所述就是小编给大家介绍的《mysql数据库做流水号》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux多线程服务端编程

Linux多线程服务端编程

陈硕 / 电子工业出版社 / 2013-1-15 / 89.00元

本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。 本......一起来看看 《Linux多线程服务端编程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具