SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【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;

関連するメモ

コメント