mysql序列表,自增序列生成合同编号
项目中使用mysql数据库,需要使用自增序列号生成合同编号,编号按年份每年更新,且根据合同模板不同需使用多个自增序列。为了考虑拓展性,也方便其他业务使用序列,使用了序列表进行集中管理,使用函数操作序列。
解决思路
currval(name)
函数获取当前序列值。nextval(name)
函数获取下一个序列值,即先自增value更新后再调用currval(name)
。nextvalForYear(name)
函数适用于按年份每年更新重置value值的场景。setval(name,value)
函数根据传入的参数手动重置value。- 附: 合同编号的字符串拼接函数
CONCAT(str1,str2,…)
:字符串拼接函数LPAD(str,len,padstr)
:字符串左填充函数RPAD(str,len,padstr)
:字符串右填充函数
例: 拼接格式 - 2020 xxxx第C0001号
//使用了左填充函数LPAD - 0001
select concat(YEAR(NOW()), ' ', #{contractTplName}, '第C', LPAD(nextval(#{seqName}),4,0), '号')
1. 创建Sequence管理表 seq_manage
DROP TABLE IF EXISTS seq_manage;
CREATE TABLE seq_manage ( seq_name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, year INT(4),PRIMARY KEY (seq_name)
) ENGINE=InnoDB;
2. 取当前值 currval(name)
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGINDECLARE value INTEGER; SET value = 0; SELECT current_value INTO value FROM seq_manageWHERE seq_name = name; RETURN value;
END
$
DELIMITER ;
3. 取下一个值 nextval(name)
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGINUPDATE seq_manageSET current_value = current_value + increment WHERE seq_name = name; RETURN currval(name);
END
$
DELIMITER ;
4. 取下一个值 nextvalForYear(name)
(按年份每年自动重置value)
DROP FUNCTION IF EXISTS nextvalForYear;
DELIMITER $
CREATE FUNCTION nextvalForYear (name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGINset @year = (select year from seq_manage WHERE seq_name = name);IF YEAR(NOW()) > @year THENUPDATE seq_manageSET current_value = 1, year = YEAR(NOW())WHERE seq_name = name;RETURN currval(name);ELSEUPDATE seq_manageSET current_value = current_value + incrementWHERE seq_name = name;RETURN currval(name);END IF;
END
$
DELIMITER ;
5. 更新当前值 setval(name,value)
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGINUPDATE seq_manageSET current_value = value WHERE seq_name = name; RETURN currval(name);
END
$
DELIMITER ;
测试相关函数:
INSERT INTO seq_manage VALUES ('test', 0, 1);
--添加一个sequence,设置名称为'test',初始值为0,以及每次的自增值为1。
--如果需要按年份更新,则还需设置year字段初始值,获取序列时则调用nextvalForYear(name)函数即可SELECT SETVAL('test', 10);
---设置'test'序列的初始值,这里设置test的初始值为10SELECT CURRVAL('test');
--查询'test'序列的当前值SELECT NEXTVAL('test');
--查询'test'序列的下一个值,不会每年重置value值SELECT nextvalForYear('test');
--查询'test'序列的下一个值,每年会更新重置value值
--可以考虑只使用nextvalForYear(name)函数,不用再创建NEXTVAL(name)函数。因为当序列不需要每年更新时,只需此序列的year字段为null即可。
欢迎访问本文的个人博客链接: https://br-bai.github.io/2020/03/16/MySQL序列表,自增序列生成合同编号
mysql序列表,自增序列生成合同编号相关推荐
- mysql自增序列表,自定义mysql自增序列
自定义mysql自增序列: 序列在pg库中有,可以直接点击操作sequences新建就行,但是mysql中没有,使用时,可以通过自定义函数和建表的方式来实现 1 创建序列表 CREATE TABLE ...
- python随机产生10个数然后前5个升序后5个降序_编写程序,生成包含 20 个随机数的列表,然后将前 10 个元素升序排列,后 10 个元素降序排列,并输出结果。_学小易找答案...
[填空题]在 Python3.x 中 input() 函数接收到的用户输入数据一律为 ________ . [填空题]运算符% (可以.不可以)对浮点数进行求余数操作. [简答题]解释 Python ...
- mysql的自动编码_mysql 自动生成编号函数
根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001 (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...
- mysql 存储订单,MySQL使用存储过程生成订单编号
生成的订单编号类似: CREATE DEFINER=`root`@`%` PROCEDURE `p`(IN table_name varchar(50),IN filed_name varchar(5 ...
- 用 Python 一键批量自动生成合同
图片来源于网络 文/毅种循环 ♚ 毅种循环,撸python和撸柯基,一个都不能少. 本文作者已加入Python中文社区专栏作者计划 一.背景 工作中经常会需要做大量的合同,不复杂,也就是在合同模板里 ...
- 使用Python爬取CSDN历史博客文章列表,并生成目录
使用Python爬取CSDN历史博客文章列表,并生成目录 这篇博客将介绍如何使用Python爬取CSDN历史博客文章列表,并生成目录. 2020年 2020年04月 cv2.threshold() 阈 ...
- python批量生成合同
对于批量操作合同文件,逐个去比对替换文件,复制粘贴是个很费劲的事,于是乎有了python自动化批量操作的这种神器. 工具原料: openpyxl模块–用于操作excel文档 python-docx模块 ...
- python制作合同模板带图片_办公自动化7_用Python操作Word批量生成合同
########## 实例7:用Python操作Word批量生成合同 ################ ''' 来源网上整理 ,供学习使用. 我们建立的模板和合同信息如下图所示:这里有几个注意事项: ...
- java实现pdf电子合同设置合同编号
前言 现在有一些用户信息合同,要求在合同上添加合同编号,合同编号要求按照一定规则系统生成.看过很多同学的实现方案,也尝试过很多,为了方便以后有同样需求的同学可以节省时间,进行了相关内容的梳理. 实现过 ...
最新文章
- 操作系统常用词典(一)
- python高效开发实战
- 抓包工具Charles基本用法
- linux多进程编程计算圆周率,中值积分定理计算PI值的多线程实现
- Redis:复制,第1部分——概述 复制与分片、哨兵与集群、Redis拓扑
- 为什么base64编码的字符串的末尾有=符号
- mysql mmm安装管理详解
- Item 27: 明白什么时候选择重载,什么时候选择universal引用
- Qt 之 QToolBox
- 【致远FAQ】致远OA启动不起来了(上集)
- js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
- 微服务实施笔记(五)——生产环境部署
- matlab三维图像分割,Matlab 沿三维任意方向切割CT图的仿真计算
- 腾讯人力资源管理体系
- caffe创建网络_Caffe2-创建自己的网络
- JS IE11 Script5 拒绝访问 跨域
- php mysql难不难_一家之言的经验之谈php+mysql扎实个人基本功
- YX150C 纯IO口 8位OTP单片机
- android 日历
- C++练手小项目:职工工资信息管理系统
热门文章
- sha1 php 加解密,介绍几个PHP 自带的加密解密函数 - sha1
- 年历显示。功能要求:1.输入一个年份,输出时在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。
- vSAN架构细节(3) - 软件组件
- mysql数据库应用与开发姜桂洪 课后答案_MySQL数据库应用与开发习题解答与上机指导...
- Dreamweaver8的安装
- 【浙政钉】微信-专有钉钉小程序-开发踩坑实记
- 存量混战 一加如何打天下?
- 使用边缘检测和形态学检测细胞
- margin-right没效果,怎么解决
- 解决HTML框架不能显示的问题