MySQL でシーケンスをエミュレートしてみた

Oracle とか PostgreSQL 等にあるシーケンスのエミュレートを、MySQLの公式ドキュメント で紹介されているので試してみた。

シーケンス用のテーブルの作成と初期値

数値型のカラムが一つあるテーブルが必要。
下記例では 1 から採番される。途中から採番したい場合は、初期値に 0 以外を入れればよい。

mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);

シーケンス値の取得方法

下記要領で取得する

mysql> UPDATE sequence SET id = LAST_INSERT_ID(id + 1);
mysql> SELECT LAST_INSERT_ID();

これだけで、シーケンスのエミュレートができる。

上記の事が実現できるメカニズムは、LAST_INSERT_ID(expr)にある。LAST_INSERT_ID(expr)に引数が渡されると、そのコネクションにおける LAST_INSERT_ID() で取得できる値が設定される。

実際に試してみるのがわかりやすいと思う。

mysql> SELECT LAST_INSERT_ID(1000);
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|             1000 |
+------------------+

これらを踏まえて説明をすると、UPDATE 文で現在の値を +1 する。その値を LAST_INSERT_ID(expr)に渡して、LAST_INSERT_ID()(引数なし)で取得できるようにしている。

意外と簡単に実現できたが、実戦投入するには色々調査不足なので、この辺は慎重にやろう。