国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-09 20:15:45
文檔

在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL

在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL:項目應(yīng)用中,曾有以下一個場景:接口中要求發(fā)送一個int類型的流水號,由于多線程模式,如果用時間戳,可能會有重復(fù)的情況(當(dāng)然概率很小)。所以想到了利用一個獨立的自增的sequence來解決該問題。當(dāng)前數(shù)據(jù)庫為:mysql由于mysql和oracle不太一樣,不支持直接
推薦度:
導(dǎo)讀在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL:項目應(yīng)用中,曾有以下一個場景:接口中要求發(fā)送一個int類型的流水號,由于多線程模式,如果用時間戳,可能會有重復(fù)的情況(當(dāng)然概率很小)。所以想到了利用一個獨立的自增的sequence來解決該問題。當(dāng)前數(shù)據(jù)庫為:mysql由于mysql和oracle不太一樣,不支持直接

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


第二步:創(chuàng)建--取當(dāng)前值的函數(shù)

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 ;


第三步:創(chuàng)建--取下一個值的函數(shù)

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 ;


第四步:創(chuàng)建--更新當(dāng)前值的函數(shù)

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 ;


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

  • INSERT INTO sequence VALUES ('TestSeq', 0, 1);----添加一個sequence名稱和初始值,以及自增幅度

  • SELECT SETVAL('TestSeq', 10);---設(shè)置指定sequence的初始值

  • SELECT CURRVAL('TestSeq');--查詢指定sequence的當(dāng)前值

  • SELECT NEXTVAL('TestSeq');--查詢指定sequence的下一個值


  • 在java代碼中,可直接創(chuàng)建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:在應(yīng)用中,還有一種用java代碼去實現(xiàn)模擬自增sequence的方式,具體思路是創(chuàng)建一張存放sequence的table,然后通過java調(diào)用sql語句去查詢和修改這個table中指定sequence名稱的值,這種方式請加上synchronized。具體代碼這里就不上傳了,因為實現(xiàn)了,未去測試過。

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

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

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

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

    d. 當(dāng) insert 語句不包括自增字段或?qū)⑵渲翟O(shè)置為 NULL 時,該值會自動填上。

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

    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) -- 不允許重復(fù)seq的存在。
    ) ENGINE=InnoDB; 
     
     
    DELIMITER / 
     
    DROP FUNCTION IF EXISTS currval /
     
    CREATE FUNCTION currval(seq_name VARCHAR(50)) 
    RETURNS BIGINT
    BEGIN
     DECLARE value BIGINT;
     SELECT current_value INTO value
     FROM sequence
     WHERE upper(name) = upper(seq_name); -- 大小寫不區(qū)分.
     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 BIGINT
    BEGIN 
     UPDATE sequence 
     SET current_value = value 
     WHERE upper(name) = upper(seq_name); 
     RETURN currval(seq_name); 
    END;
    /
     
    DELIMITER ;

    在 SQL 中使用序列:
    創(chuàng)建序列,往sequence表插入值即可:

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

    查看當(dāng)前已建序列:

    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)

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL

    在MySQL中創(chuàng)建實現(xiàn)自增的序列(Sequence)的教程_MySQL:項目應(yīng)用中,曾有以下一個場景:接口中要求發(fā)送一個int類型的流水號,由于多線程模式,如果用時間戳,可能會有重復(fù)的情況(當(dāng)然概率很小)。所以想到了利用一個獨立的自增的sequence來解決該問題。當(dāng)前數(shù)據(jù)庫為:mysql由于mysql和oracle不太一樣,不支持直接
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲国产日韩在线精品频道 | 欧美精品第一页 | 欧美三级自拍 | 一区二区三区亚洲 | 亚洲国产精品一区二区久久 | 欧美自拍亚洲 | 国产v片在线观看 | 成人a免费视频播放 | 国产精品久久久久免费 | 精品国内自产拍在线视频 | 亚洲欧美视频一区 | 五月婷婷丁香 | 精品国产成人综合久久小说 | 在线综合亚洲欧美自拍 | 久久91精品国产91久久跳舞 | 在线日韩欧美 | 国产成人精品一区二区三区 | 亚洲伊人色 | 日韩欧美精品综合一区二区三区 | 国产高清在线免费视频 | 亚洲 欧美 自拍 另类 | 韩国演艺圈一区二区三区 | 久久国产成人 | 日韩精品一二三区 | 亚洲综合欧美 | 一区二区成人国产精品 | 国产精彩视频在线观看 | 天天爽夜夜爽一区二区三区 | 亚洲视频在线免费观看 | 黄视频网站在线看 | 免费一级 一片一毛片 | 国产精品资源在线观看 | 国产午夜在线观看 | 日本三级成人中文字幕乱码 | 欧美国产日韩在线观看 | 欧美日韩午夜 | 国产精品黄大片在线播放 | 日韩欧美制服 | 久久99精品久久久久久青青91 | 久久精品无码一区二区日韩av | 美国一级大黄大色毛片视频一 |