公司數據庫用的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就好了。