MYSQL 下的自定義序列(可回零)

         公司數據庫用的oracle,但是個人開發和自己寫東西一般用mysql,覺得序列這個東西還是蠻好用的,但是mysql本身卻沒有這個功能,於是想自己試着寫一下,以後要是啥項目用得上也方便。 

         網上的有很多,但是有些是會報錯,有些很囉嗦,其實沒那麼複雜。

         先說下我的計劃需求

         1.可以有多個,分開維護不同的序列*(原因是,可能有多個表,也許不想用同一個序列)】

         2.可以設置跳的步數,既每下次加幾*(一般是+1,但是萬一呢)

         3.我需要到一個數以後,重新歸零,或者到一個設置的值*(這個功能很多人都沒寫)

          我的需求很簡單,直接上代碼吧。

           sql表建表如下:

DROP TABLE IF EXISTS `TB_SEQUENCE`;
CREATE TABLE `TB_SEQUENCE` (
  `name` varchar(30) NOT NULL,
  `current_value` int(11) NOT NULL,
  `increment` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

           兩個方法,一個方法是獲取當前值,一個方法是對數據進行累加和歸零判斷

           

CREATE FUNCTION nextval (seq_name VARCHAR(50))  
RETURNS BIGINT  
CONTAINS SQL  
BEGIN
     DECLARE value INTEGER; 
     SET value = 0; 
     SELECT current_value INTO value 
          FROM TB_SEQUENCE
          WHERE name = seq_name ; 
     RETURN value; 
END


CREATE FUNCTION nextval (seq_name VARCHAR(50))  
RETURNS BIGINT  
CONTAINS SQL  
BEGIN
     SELECT  current_value INTO @current_value FROM TB_SEQUENCE WHERE name = seq_name;
     UPDATE TB_SEQUENCE
          SET current_value = current_value + increment 
          WHERE name = seq_name;
        if(@current_value>=1) then 
					 UPDATE TB_SEQUENCE  
					 SET current_value = 0  
					 WHERE name = seq_name;
				end if;
     RETURN currval(seq_name); 
END

     @current_value>=1這行代碼根據自己需要改,我這裏是方便測試寫的>=1.也就是當序列大於等於一時,歸零。

     來測一下吧。

      加一條數據

INSERT INTO `TB_SEQUENCE` (`name`, `current_value`, `increment`) VALUES ('default', '0', '1');




SELECT nextval('default');

     成功。

     java 端調用和測試如下

  @current_value>=1這行,改成999999試試。

 完美,收工!

 其實,如果說還有別的要求是可以把這個更完善的,比如把,歸零判斷值和歸零還是歸成別的數,都放在表裏維護,這樣更靈活。

  思路就是,把表擴展一下,加一個max_value 保存最大值,加一個initValue,保存最小值。修改一下nextval就好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章