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)文章
關(guān)于django連接mysql數(shù)據(jù)庫并進行數(shù)據(jù)庫的創(chuàng)建的問題
這篇文章主要介紹了django連接mysql數(shù)據(jù)庫并進行數(shù)據(jù)庫的創(chuàng)建,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
Mysql查看數(shù)據(jù)庫時區(qū)并設(shè)置時區(qū)的方法
這篇文章主要介紹了Mysql查看數(shù)據(jù)庫時區(qū)并設(shè)置時區(qū)的方法,設(shè)置時區(qū)的方式可以通過mysql命令行模式下動態(tài)修改以及通過修改配置文件來修改時區(qū),需要的朋友可以參考下2024-02-02
MySQL語句之刪除指令deleted和truncate在使用中的異同詳解
這篇文章主要介紹了MySQL語句之刪除指令deleted和truncate在使用中的異同,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
深入分析MySQL數(shù)據(jù)類型 DECIMAL
這篇文章主要介紹了MySQL數(shù)據(jù)類型 DECIMAL的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-09-09

