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

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

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

第一章、快速了解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)文章

  • Mysql 錯誤問題匯總(不斷更新中)

    Mysql 錯誤問題匯總(不斷更新中)

    Mysql 錯誤問題匯總,我們在開發(fā)過程中經(jīng)常看到mysql的一些錯誤,這里整理下,方便需要的朋友
    2012-07-07
  • MySQL需要關(guān)注的參數(shù)及狀態(tài)變量解讀

    MySQL需要關(guān)注的參數(shù)及狀態(tài)變量解讀

    這篇文章主要介紹了MySQL需要關(guān)注的參數(shù)及狀態(tài)變量解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Mysql 5.7.19 免安裝版遇到的坑(收藏)

    Mysql 5.7.19 免安裝版遇到的坑(收藏)

    這篇文章給大家分享了mysql 5.7.19免安裝版在安裝過程中遇到的一些問題,以前有mysql服務(wù)的話 需要去停掉mysql服務(wù)。具體內(nèi)容介紹大家參考下本文
    2017-08-08
  • MySQL中幾種數(shù)據(jù)統(tǒng)計查詢的基本使用教程

    MySQL中幾種數(shù)據(jù)統(tǒng)計查詢的基本使用教程

    這篇文章主要介紹了幾種MySQL中數(shù)據(jù)統(tǒng)計查詢的基本使用教程,包括平均數(shù)和最大最小值等的統(tǒng)計結(jié)果查詢方法,是需要的朋友可以參考下
    2015-12-12
  • MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明

    MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明

    這篇文章主要介紹了MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • mysql時區(qū)查看與設(shè)置方法

    mysql時區(qū)查看與設(shè)置方法

    這篇文章主要介紹了mysql時區(qū)查看與設(shè)置方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • mysql鎖定單個表的方法

    mysql鎖定單個表的方法

    這篇文章主要介紹了mysql鎖定單個表的方法 ,需要的朋友可以參考下
    2014-05-05
  • Linux如何添加mysql系統(tǒng)環(huán)境變量

    Linux如何添加mysql系統(tǒng)環(huán)境變量

    這篇文章主要介紹了Linux如何添加mysql系統(tǒng)環(huán)境變量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mysql中JDBC的三種查詢(普通、流式、游標)詳解

    Mysql中JDBC的三種查詢(普通、流式、游標)詳解

    這篇文章主要介紹了Mysql中JDBC的三種查詢(普通、流式、游標)詳解,JDBC(Java DataBase Connectivity:java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系型數(shù)據(jù)庫提供統(tǒng)一訪問,它是由一組用Java語言編寫的類和接口組成的,需要的朋友可以參考下
    2023-08-08
  • mysql存儲過程之引發(fā)存儲過程中的錯誤條件(SIGNAL和RESIGNAL語句)實例分析

    mysql存儲過程之引發(fā)存儲過程中的錯誤條件(SIGNAL和RESIGNAL語句)實例分析

    這篇文章主要介紹了mysql存儲過程之引發(fā)存儲過程中的錯誤條件(SIGNAL和RESIGNAL語句),結(jié)合實例形式分析了mysql使用SIGNAL和RESIGNAL語句來引發(fā)存儲過程中的錯誤條件相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-12-12

最新評論