在Oracle中框全,我們經(jīng)常使用sequence來建立一個自增字段惯悠,在Mysql中,也有自增竣况,但是克婶。。(以下省略一千字丹泉。情萤。。摹恨。用過的都知道筋岛。。晒哄。主要是我懶得寫QAQ)
序列表
CREATE TABLE `sequence` (
`seq_name` varchar(50) NOT NULL, -- 序列名稱
`current_val` int(11) NOT NULL, -- 當(dāng)前值
`increment_val` int(11) NOT NULL, -- 跨度
PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
獲取當(dāng)前值的函數(shù)
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;
獲取下一個值的函數(shù)
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睁宰,為了防止高并發(fā)會出現(xiàn)重復(fù)值。
4.使用
INSERT INTO sequence (`seq_name`, `current_val`, `increment_val`) VALUES ('test', '1000', '1');
SELECT nextval('test');
得到值1001