PHP批量更新数据库有五种方案:一、CASE WHEN单语句更新;二、INSERT ON DUPLICATE KEY UPDATE;三、事务包裹多条UPDATE;四、MySQLi multi_query;五、PDO预处理循环执行。

如果您需要在PHP中对数据库中的多条记录进行更新操作,而不是逐条执行UPDATE语句,则可采用批量更新方式以提升效率并减少数据库连接开销。以下是实现PHP批量更新的多种方案:
一、使用单条UPDATE语句配合CASE WHEN
该方法通过构造一条包含多个WHEN条件的SQL语句,在一次数据库请求中完成多条记录的差异化更新,适用于主键或唯一标识明确且更新字段值各异的场景。
1、准备待更新的数据数组,每个元素包含id和对应的新字段值,例如:[ ['id' => 1, 'status' => 'done'], ['id' => 2, 'status' => 'pending'] ]。
2、拼接SQL语句,使用CASE WHEN根据id匹配并赋值,如:UPDATE orders SET status = CASE id WHEN 1 THEN 'done' WHEN 2 THEN 'pending' END WHERE id IN (1,2)。
立即学习“PHP免费学习笔记(深入)”;
3、使用PDO执行该SQL,并绑定参数(若需防注入,应将id和值均作为参数化处理)。
二、使用INSERT ... ON DUPLICATE KEY UPDATE
该方法依赖于表中存在PRIMARY KEY或UNIQUE索引,先尝试插入,若发生键冲突则执行UPDATE,适合需要“存在即更新、不存在可忽略”的批量场景。
1、构建INSERT语句,VALUES部分列出所有待更新记录的字段值,例如:INSERT INTO products (id, name, price) VALUES (1,'A',99),(2,'B',199) ON DUPLICATE KEY UPDATE name=VALUES(name), price=VALUES(price)。
2、确保表结构中id字段具有PRIMARY KEY或UNIQUE约束,否则ON DUPLICATE KEY UPDATE不会触发。
3、通过PDO::exec()执行该语句,无需预处理参数,但需注意VALUES()函数引用的是当前行的输入值。
三、使用事务包裹多条UPDATE语句
该方法将多条独立UPDATE语句置于同一事务中执行,保证原子性与一致性,适用于逻辑复杂、需校验中间状态或与其他操作联动的场景。
1、调用PDO::beginTransaction()开启事务。
2、遍历数据数组,为每条记录生成独立UPDATE语句,例如:UPDATE users SET email = ? WHERE id = ?,并使用prepare/execute逐条执行。
3、全部执行成功后调用PDO::commit()提交;若任一语句失败,则捕获异常并调用PDO::rollback()回滚。
四、使用MySQLi多查询(multi_query)
该方法利用MySQLi扩展的multi_query()函数一次性发送多条SQL指令,适用于不支持事务或需快速执行无依赖更新的场景,但错误处理粒度较粗。
1、将每条UPDATE语句拼接为字符串,用分号分隔,例如:UPDATE logs SET level='warn' WHERE id=101; UPDATE logs SET level='error' WHERE id=102;。
2、调用mysqli->multi_query($sql),然后循环调用mysqli->next_result()跳过结果集。
3、注意:无法对单条语句做参数绑定,必须提前过滤或转义所有输入值,否则存在SQL注入风险。
五、使用PDO预处理+execute批量绑定
该方法结合预处理语句与循环execute,兼顾安全性与可控性,适合中小批量(数百条内)且需严格参数校验的更新任务。
1、定义通用UPDATE模板,如:UPDATE items SET title = ?, updated_at = NOW() WHERE id = ?。
2、调用PDO::prepare()获取PDOStatement对象。
3、遍历数据数组,每次调用execute()传入对应参数,例如:[ $row['title'], $row['id'] ]。











