PHP操作MySQL如何仅更新重复数据对应的address_correct列
问题解决方案
现有代码问题
- 变量名拼写错误:查询结果存储在
$adres_rows变量中,遍历却使用了未定义的$address_rows,会直接触发报错 - 缺少更新定位条件:
UPDATE语句需要通过唯一主键entity_id定位到当前重复的行 - 执行效率低:每识别到一条重复数据就发起一次数据库请求,数据量较大时性能损耗高
修正后的PHP实现方案
你只需要在WHERE子句中指定当前重复行的entity_id即可,修正后代码如下:
$sql1 = "SELECT street, entity_id FROM adresfix"; $exist_streets = []; $db_query = $db->query($sql1); $adres_rows = $db_query->fetch_all(); foreach ($adres_rows as $address) { $current_street = $address[0]; $current_entity_id = $address[1]; if (in_array($current_street, $exist_streets)) { // 用唯一主键entity_id定位需要更新的行 $sql = "UPDATE adresfix SET address_correct = 'false' WHERE entity_id = ?"; // 建议用预处理语句避免SQL注入,也可以直接拼接:"WHERE entity_id = {$current_entity_id}" $stmt = $db->prepare($sql); $stmt->bind_param("i", $current_entity_id); $stmt->execute(); } else { $exist_streets[] = $current_street; } }
注意:如果你的address_correct字段是MySQL布尔类型,赋值时不需要加单引号,直接写false即可。
更高效率的纯SQL实现
不需要遍历PHP数组,直接在数据库层面完成计算和更新,性能远高于PHP循环方案:
方案1:所有存在重复的street对应的行全部设为false
UPDATE adresfix a INNER JOIN ( SELECT street FROM adresfix GROUP BY street HAVING COUNT(1) > 1 ) b ON a.street = b.street SET a.address_correct = 'false';
方案2:仅更新重复的后续行,保留第一条出现的记录为正常状态
UPDATE adresfix a INNER JOIN ( SELECT MIN(entity_id) AS first_id, street FROM adresfix GROUP BY street HAVING COUNT(1) > 1 ) b ON a.street = b.street AND a.entity_id != b.first_id SET a.address_correct = 'false';
内容的提问来源于stack exchange,提问作者Thijs Lausegger
相关产品推荐
相关产品推荐

