SOFTELメモ Developer's blog

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

MySQLシーケンスエミュレーション

MySQLでシーケンス。

よく分からない人に。

<シーケンス 準備運動 編>

1) 下記を実行してみる
select last_insert_id();

そしたら、こんな感じ。
+——————+
| last_insert_id() |
+——————+
| 0 |
+——————+

2) こんなのを実行してみる
select last_insert_id(5);

で、もう一度
select last_insert_id();

そしたら、こんな感じ。
+——————+
| last_insert_id() |
+——————+
| 5 |
+——————+

3) 別に select文でなくてもよい。
こんなのを実行して、
set @a := last_insert_id(6);

で、また
select last_insert_id();

そしたら、こんな感じ。
+——————+
| last_insert_id() |
+——————+
| 6 |
+——————+

4) last_insert_id(何か) ってやると、接続ごとに保持してくれるんですね。
もし、他の人が同じデータベースに接続して、
select last_insert_id(999);
ってやっても、
私の
select last_insert_id();
は、999にはならない。
分かる人は試してみるよろし。

<シーケンス 実践 編>
1) さて、では、実践。
シーケンスの値を保持するテーブルがひとつ必要なので、作る。
CREATE TABLE sequence (id int not null);

レコードがひとつ必要なので、作る。
INSERT INTO sequence (id) VALUES (1);

2) update文を使ってこんなことをしてみる。
update sequence set id = last_insert_id(id);

うん。これでは、何も変わらないわけですが。
select * from sequence;
+—-+
| id |
+—-+
| 1 |
+—-+

select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 1 |
+——————+

3) じゃあ、update文を使ってこんなことをしてみる。
update sequence set id = last_insert_id(id) + 1;

1増えましたねえ。
select * from sequence;
+—-+
| id |
+—-+
| 2 |
+—-+

select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 1 |
+——————+

あ、1ですね。

シーケンスは進み、私は、進む前の値である1を取得した。
このあと誰かがこのシーケンスから値を取得しようとすると、私が取得した1より大きい値を取得する。

うん。シーケンスですね。

update sequence set id = last_insert_id(id) + 1;
select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 2 |
+——————+

update sequence set id = last_insert_id(id) + 1;
select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 3 |
+——————+

update sequence set id = last_insert_id(id) + 1;
select last_insert_id();
+——————+
| last_insert_id() |
+——————+
| 4 |
+——————+

うん。シーケンスですね。

関連するメモ

コメント