Atomare Sequenzen unter MySQL
Fortgeschrittene Datenbanken sollten atomare Sequenzen bieten, ein Feature das man unter MySQL momentan leider vergeblich sucht. Wie dieser Artikel zeigt, kann man sich in neueren Versionen von MySQL mit ein paar kleinen Tricks zu atomaren Sequenzen verhelfen.
Mit den folgenden Statements richtet man sich in einer beliebigen MySQL Datenbank eine "sequences" Tabelle, sowie 2 Datenbankfunktionen seq_nextval(seqname) und seq_set(seqname, value, increment) ein.
CREATE TABLE `sequences` ( `sequence_name` varchar(50) collate utf8_bin NOT NULL, `current_value` bigint(20) NOT NULL default '0', `increment` int(11) NOT NULL default '1', PRIMARY KEY (`sequence_name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DELIMITER ;;
CREATE FUNCTION `seq_nextval`(seqname VARCHAR(100)) RETURNS int(11) BEGIN UPDATE sequences set current_value=(@ret:=current_value)+increment where sequence_name=seqname; RETURN @ret; END;;
CREATE FUNCTION `seq_set`(seqname VARCHAR(100), cval int(11), inc int(11)) RETURNS int(11) BEGIN REPLACE INTO sequences(sequence_name, current_value, increment) VALUES(seqname, cval, inc); RETURN cval; END;; DELIMITER ;
seq_nextval(seqname)
Gibt den nächsten Wert der Sequenz seqname zurück, und inkrementiert die Sequenz um das vorgegebene Inkrement.
Beispiel:
SELECT seq_nextval('users') as new_user_id;
seq_set(seqname, value, increment)
Erzeugt oder ersetzt eine Sequenz, und legt ihren aktuellen Wert, sowie den Inkrement fest.
Gibt den übergebenen value Wert zurück.
Beispiel:
SELECT seq_set('users', 1, 1);