數據庫表字段創建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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章