jueves, 24 de febrero de 2011

Secuencias en Mysql

Mysql no soporta secuencias, asi que basandome en este artículo:
Articulo

podemos emular el funcionamiento:


CREATE TABLE `mysql`.`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=innodb;

-- Secuencia con valores por defecto
INSERT INTO mysql.sequence_data
(sequence_name)
VALUE
('sq_my_sequence');



-- Secuencia con datos especificados
INSERT INTO mysql.sequence_data
(sequence_name, sequence_increment, sequence_max_value)
VALUE
('sq_sequence_2', 10, 100);


DELIMITER $$

SET GLOBAL log_bin_trust_function_creators = 1 $$
DROP FUNCTION IF EXISTS mysql.nextval $$
CREATE FUNCTION mysql.nextval (`seq_name` varchar(100)) RETURNS bigint(20) NOT DETERMINISTIC
BEGIN
DECLARE cur_val bigint(20);

SELECT
sequence_cur_value INTO cur_val
FROM `mysql`.`sequence_data`
WHERE sequence_name = seq_name;

IF cur_val IS NOT NULL THEN
UPDATE `mysql`.`sequence_data`
SET
sequence_cur_value = 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;
END IF;

RETURN cur_val;

END $$

DELIMITER ;

No hay comentarios:

Publicar un comentario