欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL使用Sequence創(chuàng)建唯一主鍵的實現(xiàn)示例

 更新時間:2024年05月26日 11:03:41   作者:Holy_Java  
Sequence提供了更多的靈活性,本文主要介紹了MySQL使用Sequence創(chuàng)建唯一主鍵的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

第一章、快速了解Sequence

1.1)是什么?為什么使用

數(shù)據(jù)庫中的Sequence(序列)是一種用于生成唯一數(shù)字值的對象。在關(guān)系型數(shù)據(jù)庫中,Sequence通常用于生成主鍵值或其他需要唯一標識的字段值。

Sequence通常具有以下特點:

①生成連續(xù)的數(shù)字值,每次調(diào)用會遞增或遞減。
②可以定義起始值、增量值、最小值、最大值等屬性。
③可以被多個會話共享,確保生成的值是全局唯一的。
④通常用于生成主鍵值,確保數(shù)據(jù)庫表中的每條記錄都有唯一標識。
不同的數(shù)據(jù)庫系統(tǒng)(如Oracle、MySQL、PostgreSQL等)有不同的實現(xiàn)方式和語法規(guī)則。

1.2)Sequence和自增主鍵的區(qū)別

生成方式:
Sequence:Sequence是數(shù)據(jù)庫中的一個對象,通過定義序列可以生成一系列唯一的數(shù)字值,可以手動控制序列的起始值、增量值、最小值、最大值等屬性。
自增主鍵:自增主鍵是一種特殊的主鍵約束,通常與整數(shù)類型的字段一起使用。當插入新記錄時,數(shù)據(jù)庫會自動為該字段賦予一個唯一的遞增值,而無需手動管理。

跨會話性:
Sequence:Sequence對象可以被多個會話共享,確保生成的值在整個數(shù)據(jù)庫中是唯一的,適用于需要全局唯一標識的場景。
自增主鍵:自增主鍵是針對單個表的,每個表都有自己的自增主鍵,生成的值只在該表中唯一,不跨表。

靈活性:
Sequence:Sequence提供了更多的靈活性,可以定義不同的序列屬性,如循環(huán)、緩存等,適用于需要定制化生成規(guī)則的情況。
自增主鍵:自增主鍵是一種簡單的自動生成方式,適用于簡單的唯一標識生成需求。

第二章、在MySQL中使用Sequence

2.1)創(chuàng)建mysql_sequence表

2.1.1)創(chuàng)建表

CREATE TABLE `mysql_sequence` (
  `seq_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '序列名稱',
  `seq_desc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '序列描述',
  `seq_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '序列號',
  `max_val` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

2.1.2)插入數(shù)據(jù)

數(shù)據(jù)如下:

在這里插入圖片描述

2.2)創(chuàng)建函數(shù)

2.2.1)創(chuàng)建nextval函數(shù)

DELIMITER $$
CREATE  FUNCTION `nextval`(v_seq_name VARCHAR(50)) RETURNS INT
DETERMINISTIC
BEGIN
    UPDATE mysql_sequence SET seq_no = seq_no + 1 WHERE seq_name = v_seq_name AND seq_no <= max_val;
    UPDATE mysql_sequence SET seq_no = 1 WHERE seq_name = v_seq_name AND seq_no > max_val;
    RETURN currval(v_seq_name);
END$$
DELIMITER ;

2.2.2)創(chuàng)建currval函數(shù)

DELIMITER $$
CREATE  FUNCTION currval(v_seq_name VARCHAR(50)) RETURNS INT
BEGIN
    DECLARE seq_val INT;
    SET seq_val = 0;
    SELECT seq_no INTO seq_val FROM mysql_sequence WHERE seq_name = v_seq_name;
    RETURN seq_val;
END$$
DELIMITER ;

2.2.3)創(chuàng)建timeseq函數(shù)

DELIMITER $$
CREATE  FUNCTION `timeseq`(v_seq_name VARCHAR(50), v_lpad INT) RETURNS VARCHAR(50) CHARSET utf8mb4 COLLATE utf8mb4_bin
BEGIN
    DECLARE seq_val VARCHAR(50);
    SELECT CONCAT(DATE_FORMAT(CURRENT_TIMESTAMP(), '%Y%m%d'), LPAD(nextval(v_seq_name), v_lpad, '0')) INTO seq_val FROM dual;
    RETURN seq_val;
END$$
DELIMITER ;

2.3)查詢語句與結(jié)果

輸入項為表格的seq_name字段值stud_seq和位數(shù)4

SELECT CONCAT(DATE_FORMAT(CURRENT_TIMESTAMP(), '%Y%m%d'), LPAD(nextval('stud_seq'), 4, '0'))  FROM dual;

返回結(jié)果為時間戳20240428 拼上 4位數(shù)的 0002 這里的0002是數(shù)據(jù)表seq——no字段1自增后的結(jié)果

在這里插入圖片描述

第三章、SpringDataJpa中調(diào)用

3.1)實體類

@Data
@Entity
@Table(name = "mysql_sequence")
public class MysqlSequence {
    @Id
    private String SeqName;
    private String SeqDesc;
    private String SeqNo;
}

3.2)repository接口

import com.icbc.sh.dto.MysqlSimpleSequence;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;

public interface SequenceRepo extends JpaRepository<MysqlSimpleSequence, String> {

    // 獲取下一個序列值
    @Query(value = "select nextval(:seqName) from dual", nativeQuery = true)
    int nextval(@Param("seqName") String seqName);

    // 獲取帶填充的時間序列下一個值
    @Query(value = "select timeSeq(:seqName, :lpad) from dual", nativeQuery = true)
    String timeSeqNextVal(@Param("seqName") String seqName, @Param("lpad") int lpad);

    // 重置序列
    @Transactional
    @Modifying
    @Query(value = "update sequence set val = 1 where reset_flag = ?1", nativeQuery = true)
    int resetSeq(String resetFlag);
}

3.3)controller層測試

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private SequenceRepo sequenceRepo;

    @GetMapping("/testSequence")
    public void testSequence(){
        int sequence = sequenceRepo.nextval("stud_seq");
        log.info("sequence :" + sequence);
    }
}

 到此這篇關(guān)于MySQL使用Sequence創(chuàng)建唯一主鍵的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL Sequence創(chuàng)建唯一主鍵內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論