最近给公司重新设计一套新型财务交易系统,主要是记录公司相关财务进出流水,以及退款流水,提现流水。
当然当中会设计到流水号生成。很多人都会想到直接采用自增不就可以了。为什么要设计出。当然针对一般使用DB自带自增就可以了。
这里我认为我们不先讲这个自带自增,因为太简单不过了。所以这里讲的mysql 自定义函数来管理这个自增。当然也使用自带自增原理。
先先说mysql function,一般mysql默认一般都不支持的,所以要把相关配置进行一个修改后才可以创建自定义函数。
相关执行操作如下(当然mysql一定是5以上版本,4以下版本好像是不支持的也没有使用过所以不说这个方面)
有两种方式:
1.临时性
set global log_bin_trust_function_creators=1;
2.永久性
就是在/etc/my.cnf中[mysqld] 中log_bin_trust_function_creators=1
接下来就是把我这边一个设计说明一下:
1.先建一张表,表的结构如下:
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.写入相关表的数据,以我们这边项目为例:
3.相关自定义函数说明如下:
=======================
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') 后就可以得到最大数字而且是一个自增数字,拿到这个数字后你就可以生成一串以日期时间加这个自增数字生成一个流水号
总结上面这个设计,很多人会问这样做有什么好处。我认为你得先看懂我们设计后才发言会比较好。这样做目的就是可以在不同时间内生成一个流水号,这个流水号可以使用
到订单号,交易单号,而且财务户头。在不同字符中可以看到我们后面自增数字是一个自增数字。从而达到一个有序流水号以及可以在分表分库中可以也可以得到
一个有序流水号。有相关可能疑问要可以发表评论以及对我的这个设计进行咨讯。谢谢。
文章评论