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 |
+——————+
うん。シーケンスですね。
コメント