SQL自增字段按天/月/年递增策略与定制生成示例
在IT行业中,有时候我们需要在非主键字段上实现自增控制,例如按照日期(每天、每月或每年)进行递增,并且允许定制前缀、后缀以及填充位数。这种需求在设计数据库表结构和编写SQL语句时尤为常见。以下是一个针对MySQL数据库实现的示例,展示了如何创建一个名为`man_busi_code`的表,并定义一个存储过程`f_generator_busi_code`来生成按照指定条件自增的业务代码。 首先,我们创建一个`man_busi_code`表,包含以下字段: 1. `busi_type`:整型(int,11位),用于存储类型ID,不能为空,注释为类型标识。 2. `busi_desc`:可变长度字符串(varchar,255位),默认为空,描述性文本。 3. `prefix`:可变长度字符串(varchar,255位),默认为空,用于添加前缀。 4. `suffix`:可变长度字符串(varchar,255位),默认为空,用于添加后缀。 5. `granularity`:整型(int,11位),默认为0,表示是否按照时间粒度自增,1为每日,2为每月,3为每季度,4为每年。 6. `gen_time`:日期类型,用于记录生成时间,默认为空。 7. `gen_val`:整型(int,11位),初始值为1,表示自增序列。 8. `extent`:整型(int,11位),默认为1,控制填充位数。 接下来,我们定义了一个存储过程`f_generator_busi_code`,该过程接受一个输入参数`i_busi_type`(业务类型ID)和一个输出参数`v_code`(生成的业务代码)。这个过程的主要逻辑如下: - 初始化变量v_cnt为0,用于计数已存在的相同类型的记录。 - 查询当前类型ID下是否存在记录,如果存在,获取`granularity`值。 - 根据`granularity`值决定生成规则: - 如果`granularity`为0,则直接使用Lpad函数对当前自增值(gen_val+1)进行填充,确保与`extent`指定的位数一致,并拼接前缀和后缀。 - 如果`granularity`非0,则根据具体的时间粒度(每日、每月等)更新`gen_val`并生成代码。 最后,如果发现没有冲突记录,存储过程会生成新的业务代码并将其赋值给输出参数`v_code`。如果存在冲突,存储过程会捕获事务,确保数据的一致性。完成操作后,可以使用这个存储过程来生成新的、符合自定义规则的业务代码。 总结来说,这个示例展示了一种在MySQL中实现非主键自增字段的策略,通过自定义表结构和存储过程,我们可以灵活地控制自增的规则,满足不同场景的需求。这对于数据库设计和业务逻辑管理非常有用,尤其是在需要有序、唯一标识的场景中。
CREATE TABLE `man_busi_code` (
`busi_type` int(11) NOT NULL COMMENT '类型id',
`busi_desc` varchar(255) DEFAULT NULL COMMENT '描述',
`prefix` varchar(255) DEFAULT NULL COMMENT '前缀',
`suffix` varchar(255) DEFAULT NULL COMMENT '后缀',
`granularity` int(11) NOT NULL DEFAULT '0' COMMENT '时间粒度 0 不按时间 1 日 2 月 3 季 4 年',
`gen_time` date DEFAULT NULL COMMENT '时间',
`gen_val` int(11) NOT NULL DEFAULT '1' COMMENT '序列',
`extent` int(11) NOT NULL DEFAULT '1' COMMENT '填充位数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
CREATE PROCEDURE `f_generator_busi_code`(IN i_busi_type int, OUT v_code varchar(50))
BEGIN
DECLARE v_cnt int DEFAULT 0;
DECLARE v_granularity int;
DECLARE v_fmt varchar(50);
set v_code='';
START TRANSACTION;
select count(*)
into v_cnt
from man_busi_code
where busi_type = i_busi_type;
if v_cnt > 0 then
select distinct granularity
into v_granularity
from man_busi_code
where busi_type = i_busi_type;
下载后可阅读完整内容,剩余3页未读,立即下载
- 粉丝: 51
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展