亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

在MySQL中創建實現自增的序列(Sequence)的教程

2024-07-24 13:08:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在MySQL中創建實現自增的序列(Sequence)的教程,分別列舉了兩個實例并簡單討論了一些限制因素,需要的朋友可以參考下
 

項目應用中,曾有以下一個場景:
接口中要求發送一個int類型的流水號,由于多線程模式,如果用時間戳,可能會有重復的情況(當然概率很小)。
所以想到了利用一個獨立的自增的sequence來解決該問題。
當前數據庫為:mysql
由于mysql和oracle不太一樣,不支持直接的sequence,所以需要創建一張table來模擬sequence的功能,理由sql語句如下:
第一步:創建--Sequence 管理表

DROP TABLE IF EXISTS sequence; CREATE TABLE sequence (      name VARCHAR(50) NOT NULL,      current_value INT NOT NULL,      increment INT NOT NULL DEFAULT 1,      PRIMARY KEY (name) ) ENGINE=InnoDB; 

 
第二步:創建--取當前值的函數

DROP FUNCTION IF EXISTS currval; DELIMITER $ CREATE FUNCTION currval (seq_name VARCHAR(50))      RETURNS INTEGER      LANGUAGE SQL      DETERMINISTIC      CONTAINS SQL      SQL SECURITY DEFINER      COMMENT '' BEGIN      DECLARE value INTEGER;      SET value = 0;      SELECT current_value INTO value           FROM sequence           WHERE name = seq_name;      RETURN value; END $ DELIMITER ; 

 
第三步:創建--取下一個值的函數

DROP FUNCTION IF EXISTS nextval; DELIMITER $ CREATE FUNCTION nextval (seq_name VARCHAR(50))      RETURNS INTEGER      LANGUAGE SQL      DETERMINISTIC      CONTAINS SQL      SQL SECURITY DEFINER      COMMENT '' BEGIN      UPDATE sequence           SET current_value = current_value + increment           WHERE name = seq_name;      RETURN currval(seq_name); END $ DELIMITER ; 

 
第四步:創建--更新當前值的函數

DROP FUNCTION IF EXISTS setval; DELIMITER $ CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)      RETURNS INTEGER      LANGUAGE SQL      DETERMINISTIC      CONTAINS SQL      SQL SECURITY DEFINER      COMMENT '' BEGIN      UPDATE sequence           SET current_value = value           WHERE name = seq_name;      RETURN currval(seq_name); END $ DELIMITER ; 

 
第五步:測試函數功能
當上述四步完成后,可以用以下數據設置需要創建的sequence名稱以及設置初始值和獲取當前值和下一個值。
 

  • INSERT INTO sequence VALUES ('TestSeq', 0, 1);----添加一個sequence名稱和初始值,以及自增幅度
  • SELECT SETVAL('TestSeq', 10);---設置指定sequence的初始值
  • SELECT CURRVAL('TestSeq');--查詢指定sequence的當前值
  • SELECT NEXTVAL('TestSeq');--查詢指定sequence的下一個值

 

 
在java代碼中,可直接創建sql語句查詢下一個值,這樣就解決了流水號唯一的問題。
貼出部分代碼(已測試通過)

public void testGetSequence() {   Connection conn = JDBCUtils.getConnection(url, userName, password);   String sql = "SELECT CURRVAL('TestSeq');";   PreparedStatement ptmt = null;   ResultSet rs = null;   try {     ptmt = conn.prepareStatement(sql);     rs = ptmt.executeQuery();     int count = 0;     while (rs.next()) {       count = rs.getInt(1);     }     System.out.println(count);   } catch (SQLException e) {     e.printStackTrace();   } finally {     JDBCUtils.close(rs, ptmt, conn);   } } 

 
 
ps:在應用中,還有一種用java代碼去實現模擬自增sequence的方式,具體思路是創建一張存放sequence的table,然后通過java調用sql語句去查詢和修改這個table中指定sequence名稱的值,這種方式請加上synchronized。具體代碼這里就不上傳了,因為實現了,未去測試過。

在 oracle 中, sequence 提供多表多字段可共用一個不重復值。 Mysql 中存在自增列,基本可以滿足 PK 的要求。但自增列存在限制:

a. 只能用于表中的一個字段,一張不能同時存在兩個以上的自增列 ;

b. 自增列必須被定義為 key ( PK 或 FK ) ;

c. 自增列不能被多個表共用 ;

d. 當 insert 語句不包括自增字段或將其值設置為 NULL 時,該值會自動填上。

在不要求字段順序遞增的情況下,可以在 Mysql 中實現序列,再來看下面一個例子:

DROP TABLE IF EXISTS sequence;  -- 建sequence表,指定seq列為無符號大整型,可支持無符號值:0(default)到18446744073709551615(0到2^64–1)。CREATE TABLE sequence (   name       VARCHAR(50) NOT NULL,      current_value   BIGINT UNSIGNED NOT NULL DEFAULT 0,      increment     INT NOT NULL DEFAULT 1,      PRIMARY KEY (name)  -- 不允許重復seq的存在。) ENGINE=InnoDB;   DELIMITER /  DROP FUNCTION IF EXISTS currval / CREATE FUNCTION currval(seq_name VARCHAR(50)) RETURNS BIGINTBEGIN     DECLARE value BIGINT;     SELECT current_value INTO value     FROM sequence     WHERE upper(name) = upper(seq_name); -- 大小寫不區分.     RETURN value;END;/ DELIMITER ;   DELIMITER / DROP FUNCTION IF EXISTS nextval / CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS BIGINT BEGIN      DECLARE value BIGINT;     UPDATE sequence      SET current_value = current_value + increment      WHERE upper(name) = upper(seq_name);     RETURN currval(seq_name); END;/ DELIMITER ;  DELIMITER / DROP FUNCTION IF EXISTS setval /  CREATE FUNCTION setval (seq_name VARCHAR(50), value BIGINT) RETURNS BIGINTBEGIN      UPDATE sequence      SET current_value = value      WHERE upper(name) = upper(seq_name);      RETURN currval(seq_name); END;/ DELIMITER ;

 在 SQL 中使用序列:
創建序列,往sequence表插入值即可:

mysql> insert into sequence set name='myseq';

查看當前已建序列:

mysql> select * from sequence;
+-------+---------------+-----------+| name | current_value | increment |+-------+---------------+-----------+| myseq |       0 |     1 |+-------+---------------+-----------+1 row in set (0.00 sec)

獲得序列的下一個值,第一次使用,因此值為1:

mysql> select nextval('myseq');
+------------------+| nextval('myseq') |+------------------+|        1 |+------------------+1 row in set (0.00 sec)
 


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影免费观看高清完整版在线观看| 亚洲色图五月天| 国产精品黄色影片导航在线观看| 久久影院免费观看| 夜夜躁日日躁狠狠久久88av| 自拍偷拍亚洲区| 国产欧美日韩中文字幕在线| 欧美日韩人人澡狠狠躁视频| 日本一区二区在线免费播放| 国产精品久久久久久久久粉嫩av| 欧美成人三级视频网站| 欧美日韩精品国产| 欧美一级bbbbb性bbbb喷潮片| 中文字幕一区二区三区电影| 国产v综合ⅴ日韩v欧美大片| 日韩精品在线私人| 欧美老女人性生活| 亚洲级视频在线观看免费1级| 国产日韩欧美成人| 日韩激情第一页| 日av在线播放中文不卡| 国产精品久久久久免费a∨大胸| 国产日韩av在线播放| 国产99久久精品一区二区 夜夜躁日日躁| 久久久亚洲精品视频| 亚洲在线免费看| 热门国产精品亚洲第一区在线| 欧美中文在线字幕| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲片国产一区一级在线观看| 国产亚洲精品久久久久动| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品久久99久久| 国产精品久久久久久久av电影| 国产精品∨欧美精品v日韩精品| 91国产美女在线观看| 亚洲欧洲美洲在线综合| 国产精品一区二区久久国产| 国产91对白在线播放| 亚洲视屏在线播放| 欧美大片大片在线播放| 午夜欧美不卡精品aaaaa| 亚洲精品videossex少妇| 97成人在线视频| 欧美视频精品一区| 国产日韩在线精品av| 超薄丝袜一区二区| 欧美在线视频在线播放完整版免费观看| 久久久成人精品视频| 7m精品福利视频导航| 亚洲欧美一区二区三区久久| 亚洲人成在线电影| 欧美在线视频免费观看| 亚洲国产精品悠悠久久琪琪| 精品视频久久久久久| 久久久久成人精品| 国产福利视频一区二区| 国内精品久久久久影院 日本资源| 大胆欧美人体视频| 欧美日韩性视频| 色偷偷91综合久久噜噜| 国产精品电影一区| 日韩欧美在线观看| 国产成人短视频| 中文国产成人精品| 91探花福利精品国产自产在线| 欧美一级片免费在线| 欧美精品激情blacked18| 欧美激情久久久| 日本成人免费在线| 国产有码在线一区二区视频| 色哟哟网站入口亚洲精品| 久久人91精品久久久久久不卡| 亚洲人成电影网站| 午夜精品99久久免费| 秋霞成人午夜鲁丝一区二区三区| 国产伦精品一区二区三区精品视频| 欧美日韩性视频| 日韩国产欧美精品在线| 精品久久久久久亚洲精品| 色老头一区二区三区| 国产精品色悠悠| 国产精品电影久久久久电影网| 国产精品视频26uuu| 国产精品久久久久久久久久ktv| 欧美一级电影在线| 国产欧美精品一区二区三区-老狼| 久久久免费电影| 92福利视频午夜1000合集在线观看| 日本一区二区在线播放| 国产综合香蕉五月婷在线| 欧美激情免费观看| 亚洲人成在线播放| 欧美日韩激情小视频| 日韩亚洲成人av在线| 亚洲精品成人久久| 最新亚洲国产精品| 91精品视频在线播放| 日韩在线中文字| 中文字幕不卡在线视频极品| 日韩精品在线观| 亚洲欧美国产日韩天堂区| 亚洲成人免费网站| 国产va免费精品高清在线| 日本午夜人人精品| 国产一区二区三区直播精品电影| 亚洲欧美国产日韩天堂区| 日韩中文字幕在线精品| 欧美另类老肥妇| 4k岛国日韩精品**专区| 亚洲午夜未删减在线观看| 伊是香蕉大人久久| 国产一区二区在线免费视频| 久久91亚洲精品中文字幕奶水| 国产精品专区第二| 久久影视电视剧凤归四时歌| 欧美日本啪啪无遮挡网站| 中文字幕日韩欧美精品在线观看| 日韩免费av片在线观看| 成人精品在线视频| 国产亚洲成精品久久| 97精品伊人久久久大香线蕉| 成人免费淫片视频软件| 国产亚洲福利一区| 中文字幕久热精品视频在线| 国产一区二区三区在线看| 日韩小视频在线观看| 欧美电影在线免费观看网站| 日韩av免费观影| 91影院在线免费观看视频| 欧美一区二区三区图| 欧美日本精品在线| 日韩精品极品视频免费观看| 国产欧美最新羞羞视频在线观看| 国产成人涩涩涩视频在线观看| 欧美亚洲另类激情另类| 亚洲网站在线播放| 日本免费在线精品| 成人免费大片黄在线播放| 日韩在线播放视频| 亚洲一区二区中文字幕| 57pao国产成人免费| 中文字幕在线看视频国产欧美| 亚洲精品一区二三区不卡| 久热99视频在线观看| 亚洲欧美日韩国产中文专区| 国产一区二区三区欧美| 国产一区玩具在线观看| 久久av在线播放| 亚洲第一页中文字幕| 久久免费在线观看| 国产欧美一区二区三区在线| 亚洲成人精品视频在线观看| 国产精品精品久久久| 亚洲精品在线91| 91久久久久久| 久久777国产线看观看精品| 中文字幕久久久av一区| 欧美日韩国产二区| 欧美床上激情在线观看| 久久综合国产精品台湾中文娱乐网| 国产日韩中文字幕| 欧美激情国产高清| 91美女高潮出水|