狛ログ

2017年2月18日土曜日

Codeigniterのupdate_batchで複数条件指定する時の罠。(update_batchの仕組み編)

オフィス狛 技術部です。

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メソッドに注意編)


, ,

0 件のコメント:

コメントを投稿