国产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欧美v日韩v国产v | 精品一区二区三区四区五区 | 国产午夜精品视频 | 91久久精品国产免费一区 | 欧美日韩 在线播放 | 国产日韩欧美亚洲综合首页 | 国产精品一区二区久久精品 | 不卡的中文字幕 | 综合欧美日韩 | 亚洲国产精品久久久久666 | 国产精品特级毛片一区二区三区 | 国内精品91久久久久 | 国产成人精品一区二三区在线观看 | 精品日韩欧美国产一区二区 | 日韩欧美高清 | 人与动交xxx | 高清国产一区 | 国产一区二区在线看 | 久久亚洲精品国产精品婷婷 | 亚洲综合日韩 | 国产精品电影一区二区 | 美女全黄网站 | 欧美成人一区二区 | 操日韩| 精品国产一区二区三区成人 | 免费一级毛片视频 | 国产一区二区三区欧美精品 | 成人精品第一区二区三区 | 国产在线精品成人一区二区三区 | 国产一区二区三区亚洲欧美 | 欧美日韩国内 | 日日碰日日摸日日澡视频播放 | 国产高清免费视频 | 国产一精品一aⅴ一免费 | 精品国产91久久久久 | 一级毛片视频播放 | 免费在线观看国产 |