Jump to navigation
2009-07-17
インサート文一発で複数レコードの連番もうまく作ってくれた
FirebirdのSQLで最近いいと思ったこと。
テーブルAの内容をテーブルBに一括コピーする場合で、新しく別の連番をカウントアップさせて採番したい場合にInsert文一発でできるということ。
例えば顧客マスタと顧客履歴テーブルがあったとして、
顧客マスタ:cust_mast
カラムが
cust_id int
cust_name varchar(20)
cust_rank integer
顧客履歴テーブル:cust_hist
カラムが
cust_hist_no integer (PK)
cust_id integer
cust_name varchar(20)
cust_rank integer
初期データで顧客マスタは1000件ぐらいあって顧客履歴はまだ0件だけど、運用開始時には
初期データが作成されたときの顧客履歴を用意しておきたいという場合。
以下のようなInsert文一発でできて嬉しかった。
INSERT INTO cust_hist (
cust_hist_no,
cust_id,
cust_name,
cust_rank
) SELECT
(SELECT CASE WHEN (MAX(cust_hist_no) IS NULL) THEN 0 ELSE MAX(cust_hist_no) END FROM cust_hist) + 1 ,
cust_mast.cust_id,
cust_mast.cust_name,
cust_mast.cust_rank
FROM cust_mast
ORDER BY cust_mast.cust_id ;
感覚的には複数行を一括で処理するとキー違反になりそうですがなぜか意図したとおりに1行ずつカウントアップした値を cust_hist_no に入れてくれた。
普通に考えると「カーソル使ってループでまわして一行ずつ処理するプロシージャを作らないとなー...メンドクサイ...」などと思ってたらINSERT文一発でできてラッキー!って感じ。
※
MySqlのオートインクリメントとか MS-Sql の Identity のようなそのものズバリの機能はFirebirdにはない。
(Firebirdではシーケンスというものを作ってgen_id関数で呼び出すことで連番の次の値を作る)
まあ、連番自動生成機能を使ってない(使いたくない)カラムでの話です。
テーブルAの内容をテーブルBに一括コピーする場合で、新しく別の連番をカウントアップさせて採番したい場合にInsert文一発でできるということ。
例えば顧客マスタと顧客履歴テーブルがあったとして、
顧客マスタ:cust_mast
カラムが
cust_id int
cust_name varchar(20)
cust_rank integer
顧客履歴テーブル:cust_hist
カラムが
cust_hist_no integer (PK)
cust_id integer
cust_name varchar(20)
cust_rank integer
初期データで顧客マスタは1000件ぐらいあって顧客履歴はまだ0件だけど、運用開始時には
初期データが作成されたときの顧客履歴を用意しておきたいという場合。
以下のようなInsert文一発でできて嬉しかった。
INSERT INTO cust_hist (
cust_hist_no,
cust_id,
cust_name,
cust_rank
) SELECT
(SELECT CASE WHEN (MAX(cust_hist_no) IS NULL) THEN 0 ELSE MAX(cust_hist_no) END FROM cust_hist) + 1 ,
cust_mast.cust_id,
cust_mast.cust_name,
cust_mast.cust_rank
FROM cust_mast
ORDER BY cust_mast.cust_id ;
感覚的には複数行を一括で処理するとキー違反になりそうですがなぜか意図したとおりに1行ずつカウントアップした値を cust_hist_no に入れてくれた。
普通に考えると「カーソル使ってループでまわして一行ずつ処理するプロシージャを作らないとなー...メンドクサイ...」などと思ってたらINSERT文一発でできてラッキー!って感じ。
※
MySqlのオートインクリメントとか MS-Sql の Identity のようなそのものズバリの機能はFirebirdにはない。
(Firebirdではシーケンスというものを作ってgen_id関数で呼び出すことで連番の次の値を作る)
まあ、連番自動生成機能を使ってない(使いたくない)カラムでの話です。
コメント
コメントはまだありません。
コメント追加
このアイテムは閉鎖されました。このアイテムへのコメントの追加、投票はできません。
トラバ
トラバ
トラバピングURL
http://weblog.hip-labo.com/action.php?action=plugin&name=TrackBack&tb_id=140
手動によるトラバは こちらからどうぞ。
http://weblog.hip-labo.com/action.php?action=plugin&name=TrackBack&tb_id=140
手動によるトラバは こちらからどうぞ。