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()(引数なし)で取得できるようにしている。
意外と簡単に実現できたが、実戦投入するには色々調査不足なので、この辺は慎重にやろう。