当前位置: 首页 > news >正文

MySql每天从0开始生成特定规则自增编号

一、前言

1、按一定规则生单号,要求不重复
2、例如:前缀 + 日期 + 不重复流水号,whgz-20240528-00001
在这里插入图片描述

二、数据库操作

1、MySQL新建一张表sys_sequence
seq_name 序列名称
current_val 当前编号
increment_val 步长

CREATE TABLE `sys_sequence` (`seq_name` varchar(50) NOT NULL COMMENT '序列名称',`current_val` int(11) NOT NULL COMMENT '当前值',`increment_val` int(11) NOT NULL DEFAULT '1' COMMENT '步长',PRIMARY KEY (`seq_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统自增序列';

2、mysql新建函数

2.1、执行下面的SQL,testdatabase改为自己使用的库

use testdatabase;
set global log_bin_trust_function_creators=TRUE;

2.2、执行脚本创建函数

CREATE DEFINER = `root`@`%` FUNCTION `currval`(v_seq_name VARCHAR(50))RETURNS int(11)
BEGIN
declare value integer;
set value = 0;
select current_val into value from sys_sequence where seq_name = v_seq_name;
return value;
END;CREATE DEFINER = `root`@`%` FUNCTION `nextval`(v_seq_name VARCHAR(50))RETURNS int(11)
BEGIN
update sys_sequence set current_val = current_val + increment_val where seq_name = v_seq_name;
return currval(v_seq_name);
END;

2.3、创建效果

在这里插入图片描述

在这里插入图片描述
2.4、报错处理
报错1:
报错内容:

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de

解决方法:

在服务器用root账号登录数据库,登录语句mysql -u root -p;执行如下sql,就可以创建了use testdatabase;
set global log_bin_trust_function_creators=TRUE;

报错2:

The user specified as a definer (‘root‘@‘%) does not exist

解决方法:查询中执行如下sql,给root 权限

grant all privileges on . to ‘root’@‘%’ identified by “.;
flush privileges;

报错3:

Access denied; you need (at least one of) the SYSTEM_USER privilege(s)
for this operation

MySQL8.0.16版本中新增了一个system_user帐户类型,我们需要把权限给添加进去,此处的root可以是你当前使用的账户

解决:

grant system_user on . to ‘root’;

三、代码

1、controller

package com.jeesite.modules.onlinesbgl.web;import com.jeesite.modules.onlinesbgl.service.SequenceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping(value = "f/onlinesbgl")
public class SequenceController{@Autowiredprivate SequenceService sequenceService;/*** 生成序列号*/@RequestMapping(value = "index")@ResponseBodypublic String listData() {return sequenceService.index2("whgz");}}

2、service

package com.jeesite.modules.onlinesbgl.service;import com.jeesite.modules.onlinesbgl.dao.SequenceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.text.SimpleDateFormat;
import java.util.Date;@Service
public class SequenceService {@Autowiredprivate SequenceMapper sequenceMapper;public synchronized String index(String seq) {return seq.concat("-").concat(timestamp()).concat("-").concat(next(seq.toUpperCase()));}public synchronized String index2(String seq) {return seq.concat("-").concat(timestamp()).concat("-").concat(next(timestamp()));}/***获取序列*/public String next(String seq) {// 如果该序列不存在,那么新增int exists = sequenceMapper.selectSequenceExists(seq);if (exists == 0) {sequenceMapper.insertSequence(seq, 0, 1);}// 如果超出9999, 那么重置Integer val = sequenceMapper.currVal(seq);if (val >= 9999) {sequenceMapper.resetSequence(seq, 0);}String result = "0000" + sequenceMapper.nextVal(seq);return result.substring(result.length() - 5);}/*** 获取时间*/private static String timestamp() {return new SimpleDateFormat("yyyyMMdd").format(new Date());}
}

3、mapper

package com.jeesite.modules.onlinesbgl.dao;import com.jeesite.common.mybatis.annotation.MyBatisDao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;@MyBatisDao
public interface SequenceMapper {/*** 新建序列* @param name  序列名* @param start 起始值* @param incr  递增值*/@Insert("INSERT INTO sys_sequence VALUES(#{name},${start},${incr})")public void insertSequence(@Param("name") String name, @Param("start") int start, @Param("incr") int incr);/*** 重置序列到某个值* @param name 序列名* @param val  起始值*/@Update("UPDATE sys_sequence SET current_val = ${val} WHERE seq_name = #{name}")public void resetSequence(@Param("name") String name, @Param("val") int val);/*** 获取指定序列是否存在* @param name 序列名* @return 0 不存在 1 存在*/@Select("SELECT COUNT(1) FROM sys_sequence WHERE seq_name = #{name}")public int selectSequenceExists(String name);/*** 获取指定序列下一个值* @param name 序列名* @return 值*/@Select("SELECT nextval(#{name})")public Integer nextVal(String name);/*** 获取指定序列当前值* @param name 序列名* @return 值*/@Select("SELECT currval(#{name})")public Integer currVal(String name);
}

四、调用效果

在这里插入图片描述
在这里插入图片描述

相关文章:

  • Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战
  • 开源大模型源代码
  • chap5 CNN
  • 使用 Vue 3 和 vue-print-nb 插件实现复杂申请表的打印
  • 大宋咨询(深圳车主满意度调查)如何开展汽车展会观众满意度问卷调查
  • JVM思维导图
  • java配置文件解析yml/xml/properties文件
  • 成绩发布小程序哪个好用?
  • 【Word】调整列表符号与后续文本的间距
  • 【Linux】常见命令:fping的介绍和用法举例
  • 线程思维导图
  • 【JS重点知识02】栈、堆与数据类型 关系
  • 【前端视野下的数据库概念探秘】——信息化人员必备知识面试宝典:解码“视图”与“游标”
  • Ollama+OpenWebUI+Phi3本地大模型入门
  • 安卓手机在开发者模式下 打开wifi调试功能的相关 adb 命令
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JavaScript HTML DOM
  • JavaScript中的对象个人分享
  • js
  • JS笔记四:作用域、变量(函数)提升
  • JS数组方法汇总
  • leetcode-27. Remove Element
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Selenium实战教程系列(二)---元素定位
  • 初识 webpack
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 区块链分支循环
  • 走向全栈之MongoDB的使用
  • scrapy中间件源码分析及常用中间件大全
  • #、%和$符号在OGNL表达式中经常出现
  • #java学习笔记(面向对象)----(未完结)
  • #NOIP 2014# day.1 T2 联合权值
  • (10)ATF MMU转换表
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (六)vue-router+UI组件库
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)详解PHP处理密码的几种方式
  • .ai域名是什么后缀?
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 读取 JSON格式的数据
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • [Bugku] web-CTF靶场系列系列详解⑥!!!
  • [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 视觉模型篇
  • [Cloud Networking] Layer 2
  • [codevs 1515]跳 【解题报告】
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [C语言]——内存函数
  • [Day 8] 區塊鏈與人工智能的聯動應用:理論、技術與實踐