Codeigniterのクエリビルダクラスには便利なメソッドが多くありますが、
その中でも特殊なのが「update_batch」です。
複数レコードへの更新が発生する際、
ループで回し、update文を複数回実行する事も可能ですが、
この「update_batch」を使えば、一回の処理で済ませる事が出来ます。
例えば、更新用に以下の様な配列を作成したとします。
$data = array( array( 'emp_id' => 'A001' , 'name' => 'koma taro' , 'tel' => '090-0000-1111' ), array( 'emp_id' => 'A002' , 'name' => 'koma saya' , 'tel' => '090-0000-2222' ) );
そして、update文を実行する際は、
$this->db->update_batch('emptable', $data, 'emp_id');
となります。
「emptable」(社員テーブル)が更新対象のテーブル名、
「data」が先程作成した配列、
「emp_id」(社員ID)が更新時に条件として使用するカラムの指定、となります。
つまり、
- 社員テーブルの社員IDが「A001」の名前を「koma taro」に、電話番号を「090-0000-1111」に変更する。
- 社員テーブルの社員IDが「A002」の名前を「koma saya」に、電話番号を「090-0000-2222」に変更する。
普通に考えると、update文を2回実行しないといけない様に思えます。
しかし、「update_batch」の呼び出しは1回です。
一体内部ではどんなSQLに展開しているのでしょうか?
・・・という事で、実際に実行されるSQLを調べてみると、
UPDATE `emptable` SET `name` = CASE WHEN `emp_id` = 'A001' THEN 'koma taro' WHEN `emp_id` = 'A002' THEN 'koma saya' ELSE `name` END, `tel` = CASE WHEN `emp_id` = 'A001' THEN '090-0000-1111' WHEN `emp_id` = 'A002' THEN '090-0000-2222' ELSE `tel` END WHERE `emp_id` IN ('A001','A002')
なんともトリッキーですが、確かにこれだとSQL文は1つで済みます。
update文を何度も実行するよりは、処理的にも早いと思います。
でも、ここでふと疑問が。
「複数条件指定する場合はどうするのだろう?」
ここに罠が潜んでいるのですが、ちょっと長くなってしまったので、
次回に持ち越します。
次回:Codeigniterのupdate_batchで複数条件指定する時の罠。(whereメソッドに注意編)
ActiveRecord , CodeIgniter , PHP
0 件のコメント:
コメントを投稿