由于MySQL不支持sequence,所以从Oracle迁移时需要采用自定义sequence的方式来解决。
1. 首先建立一张sequence基础表,用来存储用户所有的sequence内容。
CREATE TABLE seqmysql
(
seqname varchar(50),
`currentValue` int(11),
increment int(11) DEFAULT 1
)
2. 创建sequence操作函数。
获取当前序列值函数 currval:
CREATE DEFINER=`mysql`@`%` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
DECLARE current INTEGER;
SET current = 0;
SELECT currentValue INTO current
FROM seqMysql
WHERE seqname = seq_name;
RETURN current;
END
获取序列下一值函数 nextval:
CREATE DEFINER=`mysql`@`%` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
UPDATE seqMysql
SET currentValue = currentValue + increment
WHERE seqname = seq_name;
RETURN currval(seq_name);
END
设置序列当前值 setval
CREATE DEFINER=`mysql`@`%` FUNCTION `setval`(seq_name VARCHAR(50), value INTEGER) RETURNS int(11)
BEGIN
UPDATE seqMysql
SET currentValue = value
WHERE seqname = seq_name;
RETURN currval(seq_name);
END
使用如下方式使用MySQL的序列:
--创建一个序列,起始为1,步长为1
INSERT INTO seqmysql VALUES ('my_seq', 1, 1);
--从序列中取出下一个值
SELECT nextval('my_seq') FROM DUAL;
--从序列中取出当前值
SELECT currval('my_seq') FROM DUAL;
--设置序列当前值
SELECT setval('my_seq', 5) FROM DUAL;