[PR]
2024/11/24/Sunday
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
MySql 自動採番のようなINSERT文(仮想テーブルを使う)
2013/07/01/Monday
IDと連番を格納するようなテーブルで、連番をどんどん+1(インクリメント?)していくような処理がしたい。自動採番というか。
たとえば、
--------------------
No | order| data
--------------------
1 | 1 | apple
1 | 2 | orange
1 | 3 | cherry
2 | 1 | red
2 | 2 | blue
--------------------
このテーブルでいうと、No=1に追加するなら次はorder=4ね、みたいな処理を、できればSQL一文でやっちゃいたいなと。
そんなわけで試したこと↓
・テーブルをcreateする時点で「AUTO_INCREMENT」にする
→キーじゃないのでダメ
・INSERT文のvalueの中で+1
→書式がおかしいので当たり前のようにエラー
・INSERT SELECTで、max()を使って取得
→自分自身をSELECTすることはできないらしい。
ここで、select文をサブクエリーとして、仮想テーブル(テンポラリテーブル?)のように使えばクリアできるという裏技を発見。
そこからまた試行錯誤。
試したこと第二弾↓
・テンポラリテーブルの定義(asを付ける)のタイミング
→select文の外、カッコで括らないとだめみたい
・max()で値取得
→該当データがないときはnullが返ってくる
・NVL()でnull回避
→MySqlでは使えなかった(IFNULLを使う)
こうして最終的にたどり着いた、思ってたよりも壮大なsqlがこちらになります。
insert into edit_tbl( `no`, `order`, `data` ) values ( 1, (select tmp_tbl.next_order from (select IFNULL(max(`order`),0)+1 as next_order from edit_tbl where `no`=1) as tmp_tbl) , 'testdata' );
長っっ!!!
これだと後から見たときになにが(私のレベルだと)なんだかさっぱりわからないので、
普通に、SELECTしてからINSERT、という手順に切り替えようと思いました。
教訓:あとから見たときの分かりやすさが一番。 comments**
最新記事
(09/03)
(09/03)
(09/02)
(09/02)
(08/27)