Mysql-sequence的实现
2020-10-21 本文已影响0人
这是一个假的程序员
在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