Achei este artigo da função nextval do MySQL muito útil para adicionar uma função nextval ao MySQL. Um problema que ocorre com isso é que o LAST INSERT ID () não é definido corretamente. Além disso, pode haver um pequeno problema com o bloqueio da mesa. Eu atualizei o código para o seguinte:
CREATE TABLE `sequence_data` (
`sequence_name` varchar(100) NOT NULL,
`sequence_increment` int(11) unsigned NOT NULL DEFAULT 1,
`sequence_min_value` int(11) unsigned NOT NULL DEFAULT 1,
`sequence_max_value` bigint(20) unsigned NOT NULL DEFAULT 18446744073709551615,
`sequence_cur_value` bigint(20) unsigned DEFAULT 1,
`sequence_cycle` boolean NOT NULL DEFAULT FALSE,
PRIMARY KEY (`sequence_name`)
) ENGINE=MyISAM;
DELIMITER ;;
CREATE FUNCTION `nextval` (`seq_name` varchar(100)) RETURNS bigint(20) DETERMINISTIC
BEGIN
DECLARE cur_value BIGINT(20);
SELECT LAST_INSERT_ID(null) INTO cur_value;
UPDATE sequence_data
SET sequence_cur_value = LAST_INSERT_ID(
IF (
(sequence_cur_value + sequence_increment) > sequence_max_value,
IF (
sequence_cycle = TRUE,
sequence_min_value,
NULL
),
sequence_cur_value + sequence_increment
)
)
WHERE sequence_name = seq_name;
SELECT LAST_INSERT_ID() INTO cur_value;
RETURN cur_value;
END ;;
Nota: O retorno foi mudado de NOT DETERMINISTIC
para DETERMINISTIC
trabalhar para as minhas necessidades.