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)文章
MySQL需要關(guān)注的參數(shù)及狀態(tài)變量解讀
這篇文章主要介紹了MySQL需要關(guān)注的參數(shù)及狀態(tài)變量解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02MySQL中幾種數(shù)據(jù)統(tǒng)計查詢的基本使用教程
這篇文章主要介紹了幾種MySQL中數(shù)據(jù)統(tǒng)計查詢的基本使用教程,包括平均數(shù)和最大最小值等的統(tǒng)計結(jié)果查詢方法,是需要的朋友可以參考下2015-12-12MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明
這篇文章主要介紹了MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03Linux如何添加mysql系統(tǒng)環(huán)境變量
這篇文章主要介紹了Linux如何添加mysql系統(tǒng)環(huán)境變量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04mysql存儲過程之引發(fā)存儲過程中的錯誤條件(SIGNAL和RESIGNAL語句)實例分析
這篇文章主要介紹了mysql存儲過程之引發(fā)存儲過程中的錯誤條件(SIGNAL和RESIGNAL語句),結(jié)合實例形式分析了mysql使用SIGNAL和RESIGNAL語句來引發(fā)存儲過程中的錯誤條件相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-12-12