国产探花免费观看_亚洲丰满少妇自慰呻吟_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); } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹凤县| 新沂市| 新昌县| 鲁山县| 夏津县| 浦北县| 突泉县| 彭州市| 黔江区| 诏安县| 阳江市| 咸阳市| 房产| 西贡区| 焦作市| 团风县| 沙坪坝区| 天全县| 肥城市| 鹰潭市| 左云县| 永兴县| 台北市| 海门市| 阳朔县| 元氏县| 利辛县| 济宁市| 宜昌市| 韶山市| 禹城市| 万安县| 观塘区| 新邵县| 花莲市| 太原市| 浦江县| 锡林郭勒盟| 荣成市| 铁力市| 旌德县|