项目中使用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序列表,自增序列生成合同编号相关推荐

  1. mysql自增序列表,自定义mysql自增序列

    自定义mysql自增序列: 序列在pg库中有,可以直接点击操作sequences新建就行,但是mysql中没有,使用时,可以通过自定义函数和建表的方式来实现 1 创建序列表 CREATE TABLE ...

  2. python随机产生10个数然后前5个升序后5个降序_编写程序,生成包含 20 个随机数的列表,然后将前 10 个元素升序排列,后 10 个元素降序排列,并输出结果。_学小易找答案...

    [填空题]在 Python3.x 中 input() 函数接收到的用户输入数据一律为 ________ . [填空题]运算符% (可以.不可以)对浮点数进行求余数操作. [简答题]解释 Python ...

  3. mysql的自动编码_mysql 自动生成编号函数

    根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001  (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...

  4. mysql 存储订单,MySQL使用存储过程生成订单编号

    生成的订单编号类似: CREATE DEFINER=`root`@`%` PROCEDURE `p`(IN table_name varchar(50),IN filed_name varchar(5 ...

  5. 用 Python 一键批量自动生成合同

    图片来源于网络  文/毅种循环 ♚ 毅种循环,撸python和撸柯基,一个都不能少. 本文作者已加入Python中文社区专栏作者计划 一.背景 工作中经常会需要做大量的合同,不复杂,也就是在合同模板里 ...

  6. 使用Python爬取CSDN历史博客文章列表,并生成目录

    使用Python爬取CSDN历史博客文章列表,并生成目录 这篇博客将介绍如何使用Python爬取CSDN历史博客文章列表,并生成目录. 2020年 2020年04月 cv2.threshold() 阈 ...

  7. python批量生成合同

    对于批量操作合同文件,逐个去比对替换文件,复制粘贴是个很费劲的事,于是乎有了python自动化批量操作的这种神器. 工具原料: openpyxl模块–用于操作excel文档 python-docx模块 ...

  8. python制作合同模板带图片_办公自动化7_用Python操作Word批量生成合同

    ########## 实例7:用Python操作Word批量生成合同 ################ ''' 来源网上整理 ,供学习使用. 我们建立的模板和合同信息如下图所示:这里有几个注意事项: ...

  9. java实现pdf电子合同设置合同编号

    前言 现在有一些用户信息合同,要求在合同上添加合同编号,合同编号要求按照一定规则系统生成.看过很多同学的实现方案,也尝试过很多,为了方便以后有同样需求的同学可以节省时间,进行了相关内容的梳理. 实现过 ...

最新文章

  1. 操作系统常用词典(一)
  2. python高效开发实战
  3. 抓包工具Charles基本用法
  4. linux多进程编程计算圆周率,中值积分定理计算PI值的多线程实现
  5. Redis:复制,第1部分——概述 复制与分片、哨兵与集群、Redis拓扑
  6. 为什么base64编码的字符串的末尾有=符号
  7. mysql mmm安装管理详解
  8. Item 27: 明白什么时候选择重载,什么时候选择universal引用
  9. Qt 之 QToolBox
  10. 【致远FAQ】致远OA启动不起来了(上集)
  11. js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
  12. 微服务实施笔记(五)——生产环境部署
  13. matlab三维图像分割,Matlab 沿三维任意方向切割CT图的仿真计算
  14. 腾讯人力资源管理体系
  15. caffe创建网络_Caffe2-创建自己的网络
  16. JS IE11 Script5 拒绝访问 跨域
  17. php mysql难不难_一家之言的经验之谈php+mysql扎实个人基本功
  18. YX150C 纯IO口 8位OTP单片机
  19. android 日历
  20. C++练手小项目:职工工资信息管理系统

热门文章

  1. sha1 php 加解密,介绍几个PHP 自带的加密解密函数 - sha1
  2. 年历显示。功能要求:1.输入一个年份,输出时在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。
  3. vSAN架构细节(3) - 软件组件
  4. mysql数据库应用与开发姜桂洪 课后答案_MySQL数据库应用与开发习题解答与上机指导...
  5. Dreamweaver8的安装
  6. 【浙政钉】微信-专有钉钉小程序-开发踩坑实记
  7. 存量混战 一加如何打天下?
  8. 使用边缘检测和形态学检测细胞
  9. margin-right没效果,怎么解决
  10. 解决HTML框架不能显示的问题