天天看點

Mysql建立自增&循環序列(函數實作循環,取next)Mysql建立自增&循環序列(函數實作循環,取next)

Mysql建立自增&循環序列(函數實作循環,取next)

前言

1:oracle可以直接建立自增循環序列,但是mysql沒有序列

2:mysql實作序列的方式:建立序清單(最少要有序列名,序列值、自增值),基于表建立function實作序列功能

3:序列可以幹啥–(日期+時間+序列)可以當做業務流水号,唯一辨別。

table

建立表的sql,其中min_value和max_value可以去掉

這裡建立的是7位自增循環序列,為了簡單value直接從1000000(7位)開始。

CREATE TABLE `t_sequence` (
  `id` bigint(21) NOT NULL COMMENT '序列号ID',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '序列名',
  `value` bigint(21) NOT NULL COMMENT '序列值',
  `increment` int(1) NOT NULL DEFAULT 1 COMMENT '序列自增值 1',
  `min_value` bigint(21) NOT NULL DEFAULT 1000000 COMMENT '最小序列值',
  `max_value` bigint(21) NOT NULL DEFAULT 9999999 COMMENT '最大序列值',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `id` (`id`) USING BTREE,
  UNIQUE KEY `name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin comment '序清單';
           

function

先建立一個擷取序列目前value的函數

CREATE FUNCTION get_seq_current(seq_name char(100))
	RETURNS BIGINT
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL	SECURITY DEFINER
	COMMENT ''
BEGIN
	DECLARE current_value BIGINT;
	SET current_value = 0;
	SELECT value into current_value FROM t_sequence WHERE name = seq_name;
	RETURN current_value;
END;
           

在建立一個擷取序列最大值的函數`

##擷取最大value
CREATE FUNCTION get_seq_max(seq_name char(100))
	RETURNS BIGINT
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL	SECURITY DEFINER
	COMMENT ''
BEGIN
	DECLARE max BIGINT;
	SET max = 0;
	SELECT max_value into max FROM t_sequence WHERE name = seq_name;
	RETURN max;
END;
           

最後建立一個擷取序列下一個值的函數(在該函數内實作自增以及循環)

CREATE FUNCTION get_seq_next1(seq_name char(100))
	RETURNS BIGINT
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL	SECURITY DEFINER
	COMMENT ''
BEGIN
	IF(get_seq_current(seq_name) >= get_seq_max(seq_name))THEN
		update t_sequence SET value = min_value where name = seq_name;
	ELSE
		update t_sequence SET value = (value + increment) where name = seq_name;
	END IF;
	RETURN get_seq_current(seq_name);
END;
           

效果

目前的資料,序列名:base_number,目前值:9999999

Mysql建立自增&循環序列(函數實作循環,取next)Mysql建立自增&循環序列(函數實作循環,取next)

使用函數擷取目前的value,得到結果:9999999

Mysql建立自增&循環序列(函數實作循環,取next)Mysql建立自增&循環序列(函數實作循環,取next)

使用函數擷取下一個value,得到結果:1000000

Mysql建立自增&循環序列(函數實作循環,取next)Mysql建立自增&循環序列(函數實作循環,取next)

繼續閱讀