国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 12:45:15
字體:
來源:轉載
供稿:網友

項目應用中,曾有以下一個場景:
接口中要求發送一個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); } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湟源县| 万山特区| 苏州市| 英吉沙县| 原平市| 监利县| 隆子县| 临泽县| 固安县| 开封市| 都昌县| 安吉县| 库车县| 丹凤县| 博兴县| 林甸县| 祁连县| 中超| 丹东市| 凯里市| 乡城县| 郯城县| 姚安县| 鄂伦春自治旗| 巴东县| 阳信县| 蛟河市| 隆德县| 巴中市| 南阳市| 鸡泽县| 旬阳县| 监利县| 砚山县| 陆川县| 陵水| 阿尔山市| 青铜峡市| 青铜峡市| 富宁县| 三门峡市|