微豆之眼

  • 首页
  • GPTs定制
  • 幻兽帕鲁
    • 幻兽帕鲁私服搭建
    • 幻兽帕鲁游戏下载
  • 个人项目
    • 彩云智能助手
    • 开发工具集锦
  • 技术手册
    • PHP 中文手册
    • PHP 函数索引
    • Python 手册
    • JAVA8 手册
    • JAVA11 手册
  • 瑞安学车
  • 关于自己
  1. 首页
  2. MySQL
  3. 正文

Mysql 分库自增键流水号生成原理

2017年2月13日 4770点热度 1人点赞 0条评论

最近给公司重新设计一套新型财务交易系统,主要是记录公司相关财务进出流水,以及退款流水,提现流水。
当然当中会设计到流水号生成。很多人都会想到直接采用自增不就可以了。为什么要设计出。当然针对一般使用DB自带自增就可以了。
这里我认为我们不先讲这个自带自增,因为太简单不过了。所以这里讲的mysql 自定义函数来管理这个自增。当然也使用自带自增原理。

先先说mysql function,一般mysql默认一般都不支持的,所以要把相关配置进行一个修改后才可以创建自定义函数。
相关执行操作如下(当然mysql一定是5以上版本,4以下版本好像是不支持的也没有使用过所以不说这个方面)

有两种方式:
1.临时性

Source code   
set global log_bin_trust_function_creators=1;

 

2.永久性

 

Source code   
就是在/etc/my.cnf中[mysqld] 中log_bin_trust_function_creators=1

接下来就是把我这边一个设计说明一下:
1.先建一张表,表的结构如下:

Source code   
CREATE TABLE IF NOT EXISTS `sequence` (
`seq_name` varchar(50) NOT NULL,
`current_value` bigint(20) NOT NULL default '1000000001',
`increment` smallint(6) NOT NULL default '1',
`remark` varchar(100) NOT NULL,
PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

说明一下上面表结构字段说明:
1.seq_name 自增名称
2.current_value 当前自增数
3.increment 自增移量
4.remark 业务说明

2.写入相关表的数据,以我们这边项目为例:

2017-02-13_4.27.14

3.相关自定义函数说明如下:

Source code   
=======================
delimiter $$
CREATE FUNCTION `FUN_SEQ_CURRENT_VALUE`(SEQ VARCHAR(50)) RETURNS BIGINT(20)
BEGIN
DECLARE VALUE INTEGER;
SET VALUE=0;
SELECT CURRENT_VALUE INTO VALUE
FROM `sequence`
WHERE SEQ_NAME=SEQ;
RETURN VALUE;
END;
$$
=======================
delimiter $$
CREATE FUNCTION `FUN_SEQ_SET_VALUE`(SEQ VARCHAR(50), VALUE INTEGER) RETURNS BIGINT(20)
BEGIN
UPDATE `sequence`
SET CURRENT_VALUE=VALUE
WHERE SEQ_NAME=SEQ;
RETURN FUN_SEQ_CURRENT_VALUE(SEQ);
END;
$$
=======================
delimiter $$
CREATE FUNCTION `FUN_SEQ`(SEQ VARCHAR(50)) RETURNS BIGINT(20)
BEGIN
UPDATE `sequence`
SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT
WHERE SEQ_NAME=SEQ;
RETURN FUN_SEQ_CURRENT_VALUE(SEQ);
END;
$$
=======================

相关定义功能我认为不需要详细说明,还是让大家想想为什么要这样子定义,看懂上面三个函数我认为应该可以明白这样子定义理由

不过还是得说明一下:
1.FUN_SEQ_CURRENT_VALUE 代表生成一个自增数字相关操作主要对于current_value查询进行执行
2.FUN_SEQ_SET_VALUE 代表生成一个自增数字相关操作主要对于current_value数字进行查询后生成一个最大数字
3.FUN_SEQ 代表自增名称传入后生成一个最新最大数字,其实综合前面两个函数
4.相关定义完成后,我就是可以直接使用
select FUN_SEQ('seq_name') 后就可以得到最大数字而且是一个自增数字,拿到这个数字后你就可以生成一串以日期时间加这个自增数字生成一个流水号

总结上面这个设计,很多人会问这样做有什么好处。我认为你得先看懂我们设计后才发言会比较好。这样做目的就是可以在不同时间内生成一个流水号,这个流水号可以使用
到订单号,交易单号,而且财务户头。在不同字符中可以看到我们后面自增数字是一个自增数字。从而达到一个有序流水号以及可以在分表分库中可以也可以得到
一个有序流水号。有相关可能疑问要可以发表评论以及对我的这个设计进行咨讯。谢谢。

标签: 暂无
最后更新:2018年8月16日

zhangsongfu

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

zhangsongfu

这个人很懒,什么都没留下

最新 热点 随机
最新 热点 随机
推荐15个免费的AI绘画工具和网站 基于 Postfix、Dovecot 和 Mailman 构建企业邮局系统 FC模拟器网页版_按键说明 特斯拉汽车又再一次涨价 亚马逊鼓励员工辞职搞快递服务 苹果与高通达成和解个人感想
nginx+lua 搭建高效应用服务器 Nginx 正向代理配置 特斯拉汽车又再一次涨价 Varnish 服务配置文件 亚马逊鼓励员工辞职搞快递服务 苹果与高通达成和解个人感想

COPYRIGHT © 2024 微豆之眼. ALL RIGHTS RESERVED.

浙ICP备18014576号-1

浙公网安备33010602009228号