忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

MySql 自動採番のようなINSERT文(仮想テーブルを使う)
 
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**
yourname ()
title ()
website ()
message

pass ()
- 12 - 11 - 10 - 9 - 6 - 4 - 3 - 2
prev  top next
BACKGROUND / tudu*uzu
TEMPLATE / Lenny
忍者ブログ [PR]