背景:当然是提高程序性能,缩短执行时间。
批量更新同一属性为相同的值,这个就没什么好讨论的,不会的,自行百度或者Google。
1、第一种方法首先想到是用MySQL 的case when 组装一个SQL,然后执行
a、更新其中一个属性时,SQL如下:
UPDATE test_user
SET t_name = CASE t_id
WHEN 1 THEN '张三'
WHEN 2 THEN '王五'
WHEN 3 THEN '李四'
END
WHERE t_id IN (1,2,3)
b、更新其中两个属性是,SQL如下:
UPDATE test_user
SET t_name = CASE t_id
WHEN 1 THEN '张三'
WHEN 2 THEN '王五'
WHEN 3 THEN '李四'
END,
t_gender = CASE t_id
WHEN 1 THEN 0
WHEN 2 THEN 1
WHEN 3 THEN 1
END
WHERE t_id IN (1,2,3)
更新更多属性以此类推,就不一一举例了。
注意:MySQL5.6及以下,在用case when 更新属性的值json格式,中文貌似有问题。MySQL5.7及以上,可以用json_object来解决这个问题。
2、拼凑SQL更新法,直接上菜
$tbName = 'test_user';
$updateTime = time();
$sqlArr = [];
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '张三','t_update_time' => $updateTime],['t_id' => 1])->getRawSql();
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '王五','t_update_time' => $updateTime],['t_id' => 2])->getRawSql();
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '李四','t_update_time' => $updateTime],['t_id' => 3])->getRawSql();
$sql = implode(";\n", $sqlArr) . ';';
\Yii::$app->db->createCommand($sql)->execute();
拼凑SQL的循环根据自己的实际情况进行组装。
3、用replace into 或者 insert into on duplicate key update来实现