数据库表字段创建nextval函数实现字符串数字自增

  • 需求:表中的主键id是字符串类型的,要实现主键自增就需要用这这个函数啦。

首先要创建table_sequence表

CREATE TABLE `table_sequence` (
  `sequence_names` varchar(50) NOT NULL,  -- 序列名称
  `current_value` bigint(50) NOT NULL,  -- 当前值
  `increment` int(1) NOT NULL,  -- 步长(跨度)
  PRIMARY KEY (`sequence_names`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述
sequence_names:代表主键自增的那张表名
current_value:代表当前主键的值,只能是数字类型,如果要带字母的主键,需要自己再代码中拼接
increment:代表每次自增的步长

下面需要创建两个函数

1.获取当前主键值

DELIMITER $$
USE `数据库名字`$$
DROP FUNCTION IF EXISTS `currval`$$
CREATE FUNCTION `currval`(`sequence_name` VARCHAR(50)) RETURNS BIGINT(50)
BEGIN
	DECLARE seq_current BIGINT(40);
  SET seq_current = 0;
  SELECT t.current_value INTO seq_current FROM table_sequence t WHERE t.sequence_names = sequence_name;
  RETURN seq_current;
END$$
DELIMITER ;

2.获取下一个自增主键值

DELIMITER $$
USE `数据库名字`$$
DROP FUNCTION IF EXISTS `nextval`$$
CREATE FUNCTION `nextval`(`sequence_name` VARCHAR(50)) RETURNS BIGINT(50)
BEGIN
	DECLARE seq_current BIGINT(20);
	DECLARE seq_increment INT(1);
  SET seq_current = 0;
  SET seq_increment = 0;
	SELECT current_value INTO seq_current FROM table_sequence WHERE sequence_names=sequence_name FOR UPDATE;
	SELECT increment INTO seq_increment FROM table_sequence WHERE sequence_names=sequence_name FOR UPDATE;
	UPDATE table_sequence SET current_value=seq_current+seq_increment WHERE sequence_names=sequence_name;
  SET seq_current = seq_current + seq_increment;
  RETURN seq_current;
END$$
DELIMITER ;

在这里插入图片描述
创建了两个自定义函数

下面是java代码部分

创建一个SequenceMapper.java的接口

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface SequenceMapper {

     /**
      *  获取下一个主键值
     */
     String queryNextSequence(@Param("seq_table_name") String seq_table_name);

     /**
      * 获取当前主键值SequenceMapper.xml
      */
     String queryCurSequence(@Param("seq_table_name") String seq_table_name);
}

创建一个SequenceMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dowin.miniapp_admin.mapper.SequenceMapper">

    <select id="queryNextSequence" resultType="java.lang.String">
        select
        nextval(#{seq_table_name})
    </select>

    <select id="queryCurSequence" resultType="java.lang.String">
        select
        currval(#{seq_table_name})
    </select>

</mapper>

到此代码就结束了!!!
下面就是调用写的接口啦
1.先注入bean

@Resource
private SequenceMapper sequenceMapper;

2.调用接口

td_b_house_ad是表名

String curId = sequenceMapper.queryCurSequence("td_b_house_ad");
String nextId = sequenceMapper.queryNextSequence("td_b_house_ad");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值