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 权限

在这里插入图片描述

1、确认用户是否存在:检查MySQL的用户账户是否存在。可以使用以下命令:

SELECT user, host FROM mysql.user;

查看是否有'root'@'%'这样的用户。

2、如果用户不存在,创建用户或者重新授权:

2.1、MySQL 8.0 以上版本使用下面的命令,因为新版的的mysql版本已经将创建用户和赋予权限的操作分开了,需要分两步操作:
CREATE USER 'root'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

替换'password'为实际的密码。

2.2、MySQL 8.0 以下版本使用下面的命令就可以
grant all privileges on . to ‘root’@‘%’ identified by “.;
flush privileges;

3、如果用户存在,但主机名不正确,你可能需要创建一个特定的主机用户:

CREATE USER 'root'@'hostname' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'hostname' WITH GRANT OPTION;
FLUSH PRIVILEGES;

替换'hostname'为实际的主机名。
如果是在复制环境中,确保复制用户和权限被正确地复制到从服务器上。
如果以上步骤不适用,可能需要查看相关的权限表,手动修正definer字段。这通常不建议,除非你非常清楚自己在做什么,因为直接操作系统表可能会破坏数据库的一致性和安全性。

报错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{

	@Autowired
	private SequenceService sequenceService;

	/**
	 * 生成序列号
	 */
	@RequestMapping(value = "index")
	@ResponseBody
	public 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 {

    @Autowired
    private 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);
}

四、调用效果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/684932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kafka-消费者-消费异常处理(SpringBoot整合Kafka)

文章目录 1、消费异常处理1.1、application.yml配置1.2、注册异常处理器1.3、消费者使用异常处理器1.4、创建生产者发送消息1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、消费者控制台:1.8.1、第一次启动SpringK…

【案例分享】明道数云为阿联酋迪拜公司Eastman BLDG打造外贸管理系统

内容概要 本文介绍了Eastman公司与明道数云软件的合作,通过数字化解决方案提升了Eastman在贸易管理中的效率。Eastman公司位于阿联酋迪拜,周边城市有门店,人数大概在30,是一家主营瓷砖和石材类产品的贸易公司,面临着各…

C#,JavaScript实现浮点数格式化自动保留合适的小数位数

目标 由于浮点数有漂移问题,转成字符串时 3.6 有可能得到 3.6000000000001,总之很长的一串,通常需要截取,但按照固定长度截取不一定能使用各种情况,如果能根据数值大小保留有效位数就好了。 C#实现 我们可以在基础库里…

linux实验报告

实验一:Linux操作系统的安装与配置 实验目的: 1.掌握虚拟机技术; 2.掌握Linux的安装步骤; 3.掌握安装过程中的基本配置要求。 4.掌握正确启动Linux的方法; 5.掌握正确退出Linux的方法; 6.熟悉已安装…

【Python】把xmind转换为指定格式txt文本

人工智能训练通常需要使用文本格式,xmind作为一种常规格式不好进行解析,那如何把xmind转换为txt格式呢? 软件信息 python python -v Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32…

C#知识|通过ADO.NET实现应用程序对数据库的查询操作。

哈喽,你好啊,我是雷工! 前边学习了通过ADO.NET实现C#应用程序对数据库的增、删、改操作。 接下来接着学习查询操作,以下为学习笔记。 查询返回有两种类型,一种是单行单列的单一结果,一种是结果集,首先了解查询结果是单行单列结果的写法。 01 查询返回单一结果 以前方的…

Python编程学习第一篇——Python零基础快速入门(五)—元组(Tuple)操作

Python元组是一种不可变的有序集合,可以存储多个不同类型的数据。元组使用小括号来表示,其中的元素用逗号分隔开。与列表不同,元组的元素不能被修改、删除或添加。它的一些常规操作包括元组的创建、访问、添加、修改、删除、运算等等&#xf…

编译原理-程序设计语言的设计

变量 存储单元及它的名称由变量的概念来代替; 可以代表一个或一组单元,可以修改。 绑定 绑定:一个实体(或对象)与其某种属性建立起某种联系的 过程,称为绑定。 静态绑定:凡是在编译时能确定的属性,称为静态属性; 若绑定在编译时完成,运行时不改变,称为静态…

武汉科技大学,计算机考研全面改考408,24计算机专硕复试线仅298分!武汉科技大学计算机考研考情分析!

武汉科技大学(Wuhan University of Science and Technology)简称“武科大”,坐落于湖北省武汉市,是湖北省人民政府、教育部和六家国家特大型企业共建高校,是湖北省“双一流”建设重点高校,入选国家“中西部…

高考志愿填报自动更新数据小程序开源版开发

高考志愿填报自动更新数据小程序开源版开发 版本一:java开源域名授权(自动更新数据);5999 自研RSCH算法,专业和测评综合推算 微信一键登录注册,免注册获取微信头像、昵称 支持院校和专业优先,…

28 - 只出现一次的最大数字(高频 SQL 50 题基础版)

28 - 只出现一次的最大数字 select (selectnumfromMyNumbers group bynum havingcount(num)1order by num desc limit 1) as num;

Doris insert into 插入语句执行成功,且select查询成功,返回结果不报错,但查不到该插入数据

问题:Doris insert into 正常执行成功,select 查询也执行成功,但查不到该写入数据 原因:由于有其他 insert commit 事务待提交且该任务处于锁的状态,导致不断在回滚,进而造成其他的insert into 语句也执行成…

广西容县“四力”并举提质效,正宇软件助力智慧人大建设

近日,广西容县在提升人大代表履职质效方面取得显著成效,通过汇聚“四力”——活力、动力、合力、能力,成功打造了一个高效、务实的人大代表履职环境。这一成果不仅为当地人大工作树立了新的标杆,也为广西乃至全国的人大代表履职模…

24-unittest简介

一、unittest简介 unittest是Python中常用的单元测试框架,与Java中的Junit单元测试框架类似。 二、示例程序 1)导入unittest模块 import unittest 2)使用help()函数查看源码中的示例程序 help(unittest) Simple usage:import unittestc…

数组和指针的联系(C语言)

数组和指针是两种不同的数据类型,数组是一种构造类型,用于存储一组相同类型的变量;而指针是一种特殊类型,专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外,其他情况下都表示的是首元素的…

Visual Studio Code 开发esp8266流程2Arduino 配置 nodemcu

http://arduino.esp8266.com/stable/package_esp8266com_index.json http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino: Library Manager Arduino: Board

零拷贝技术

背景 磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的…

【Unity学习笔记】反射

文章目录 前言反射通过反射获取类型 Unity中的反射用反射在Unity中动态加载 前言 在我平时做项目的时候,由于我们做的项目都是很简单的,所以不怎么接触反射机制。最早了解反射机制是关于Invoke的时候,知道可以通过方法名来直接进行Invoke调用…

数字人动作解决方案,塑造逼真动作

在品牌形象塑造、市场推广及客户服务等领域,企业正面临着前所未有的挑战和机遇。为满足企业的需求,美摄科技凭借其在人工智能和计算机视觉领域的深厚积累,推出了面向企业的数字人动作解决方案,助力企业轻松打造逼真、灵活的虚拟形…

apple开发者账户证书删除与下载

1.打开并登陆: Sign In - Apple 选择证书 证书管理页面 证书详情 删除或者下载证书 下载证书 删除证书