Mysql-sequence的实现

在Oracle中,我们经常使用sequence来建立一个自增字段,在Mysql中,也有自增,但是。。(以下省略一千字。。。。用过的都知道。。。主要是我懒得写QAQ)

序列表
CREATE TABLE `sequence` (
  `seq_name` varchar(50) NOT NULL, -- 序列名称
  `current_val` int(11) NOT NULL, -- 当前值
  `increment_val` int(11) NOT NULL, -- 跨度
  PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
获取当前值的函数
CREATE FUNCTION currval (v_seq_name VARCHAR(50)) RETURNS INTEGER
BEGIN
DECLARE current INTEGER;
SET current = 0;
SELECT
    current_val INTO current
FROM
    sequence
WHERE
    seq_name = v_seq_name;
RETURN current;
END;
获取下一个值的函数
CREATE FUNCTION nextval (v_seq_name VARCHAR(50)) RETURNS INTEGER
BEGIN
DECLARE current INTEGER;
SET current = 0;
SELECT
    current_val + increment_val INTO current
FROM
    sequence
WHERE
    seq_name = v_seq_name FOR UPDATE;
UPDATE sequence
SET current_val = current
WHERE
    seq_name = v_seq_name;
RETURN current;
END;

这里使用了一个悲观锁 for update,为了防止高并发会出现重复值。

4.使用

INSERT INTO sequence (`seq_name`, `current_val`, `increment_val`) VALUES ('test', '1000', '1');

SELECT nextval('test');

得到值1001

你可能感兴趣的:(Mysql-sequence的实现)