【MySQL】シーケンス
問題
MySQLにシーケンスある?
答え
同等のことはできる。でも意外と正しく使ってもらえないことがある。
公式ドキュメントでも紹介しているシーケンスのエミュレート方法のメモ。
1、シーケンス用のテーブルを作る
数値を入れるカラムがあり、1行だけレコードがあればよい。AUTO_INCREMENTする必要はない。
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
2、シーケンス番号を取得する
さっそく使える。
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();
UPDATE文でシーケンスの番号を増やして、LAST_INSERT_ID()へは+1した番号を渡しておき、次に引数なしでLAST_INSERT_ID()が呼び出されたとき、その値を取得できるようにする。2つ目のSELECT文でその値を引き出している。
LAST_INSERT_ID(0+1)をすると、LAST_INSERT_ID(0+1)は1を返し、次に引数なしでLAST_INSERT_ID()をすると1が返ってくる。
LAST_INSERT_ID(1+1)をすると、LAST_INSERT_ID(1+1)は2を返し、次に引数なしでLAST_INSERT_ID()をすると2が返ってくる。
LAST_INSERT_ID(2+1)をすると、LAST_INSERT_ID(2+1)は3を返し、次に引数なしでLAST_INSERT_ID()をすると3が返ってくる。
LAST_INSERT_ID()の値は接続ごとに独立しているので、以下のような順番でSQLが流れても、値が重複せずに加算されて、取得できる。
Aさんの mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); Bさんの mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); Bさんの mysql> SELECT LAST_INSERT_ID(); Cさんの mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); Aさんの mysql> SELECT LAST_INSERT_ID(); Cさんの mysql> SELECT LAST_INSERT_ID();
間違った使い方の例
↓ アクセスが殺到したときなどに困ったことになる例
mysql> UPDATE sequence SET id=id+1; mysql> SELECT id from sequence;
コメント