logo头像
Snippet 博客主题

mysql序列的创建

本文于 2137 天之前发表,文中内容可能已经过时。

mysql的序列接介绍

mysql中没有像oracle中的序列那样方便,但是我们可以使用特殊的表结构,加上自定义函数来完成相关的功能。

不废话,直接看代码!

1、先创建一个表,用于存储所有的序列。

CREATE TABLE `sequence` (
  `sequence_name` varchar(100) NOT NULL COMMENT '序列的名称',
  `current_value` int(11) DEFAULT '1' COMMENT '当前值',
  `increment` int(11) DEFAULT '1' COMMENT '步长(每次增长的大小)',
  PRIMARY KEY (`sequence_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、新增一个自定义函数(UDF),用户快速新增序列

解释:向序列表里边新增一条数据。

    CREATE FUNCTION CREATE_SEQ (seq_name VARCHAR(100),step_num INT UNSIGNED)
    RETURNS VARCHAR(50)
    BEGIN
    		DECLARE result VARCHAR(100);
    		DECLARE tempNum INT;
    		SET result = 'The sequence has exist!';
    		SET tempNum = (SELECT current_value FROM sequence WHERE sequence_name = seq_name);
    		IF ISNULL(tempNum)=1 THEN
    			INSERT INTO sequence (sequence_name,increment) VALUES (seq_name,step_num);
    			SET result ='CREATED SUCCESS';
    		END IF;
    RETURN result;
    END

3、新增一个自定义函数(UDF),用于查找序列

解释:将表中的current_value查找出来,同时将current_value加上步长,用于下次查询。

   CREATE FUNCTION next_value(seq_name VARCHAR(100))
   RETURNS INT
   BEGIN
   	DECLARE result_num INT;
   	DECLARE tempNum INT;
   	SET result_num = 0;
   	SET tempNum = (SELECT current_value FROM sequence WHERE sequence_name = seq_name);
   	IF ISNULL(tempNum)=0 THEN
   		SET result_num=tempNum;
   		UPDATE sequence SET current_value = current_value+increment WHERE sequence_name = seq_name;
   	END IF;
   	RETURN result_num;
   END

4、新增一个自定义函数(UDF),用于重置序列

解释:将表中的current_value重置为1,用于下次查询。

CREATE FUNCTION reset_sequence(seq_name VARCHAR(100))
RETURNS VARCHAR(100)
BEGIN
	DECLARE result VARCHAR(100);
	DECLARE tempNum INT;
	SET result = 'NOT EXISTS THIS SEQUENCE!';
	SET tempNum = (SELECT current_value FROM sequence WHERE sequence_name = seq_name);
	IF ISNULL(tempNum)=0 THEN
		UPDATE sequence SET current_value = 1 WHERE sequence_name = seq_name;
		SET result = 'RESET SUCCESS';
	END IF;
	RETURN result;
END

使用的时候直接使用:

select 函数名([参数]);

OK,mysql的序列到此完成,总体来说,此次创建的序列的功能和oracle的序列比较起来,功能还是比较单一,但是提供了另外一种解决问题的思路。
希望看到此博文的同学可以对mysql的序列有一个比较简单的认识,并学会一些mysql的基本使用方法。
加油!