如何在PHP中删除单表多条记录:删除Owning表无关联的Owner数据
方案1:直接执行批量删除SQL(最高效,无需查询遍历)
你完全不需要先把待删除的记录查出来再循环删除,直接用一条DELETE语句就能完成批量操作,代码如下:
// 直接执行删除语句,匹配所有不存在关联Owning记录的Owner $deleteSql = "DELETE FROM Owner WHERE id NOT IN (SELECT Ownerid FROM Owning)"; $execResult = mysqli_query($link, $deleteSql); // 可以获取删除的行数做后续业务判断 if ($execResult) { $deletedCount = mysqli_affected_rows($link); echo "成功删除{$deletedCount}条无关联的Owner记录"; } else { echo "删除失败:" . mysqli_error($link); }
这种方式全程只和数据库交互2次(一次执行删除,一次拿影响行数),比遍历查询结果逐条删除性能高很多,尤其是待删除数据量较大的时候优势更明显。
方案2:基于现有代码改造(遍历查询结果逐条删除)
如果你有特殊需求需要先遍历待删除记录(比如要先打印待删记录、记录操作日志),可以这么改你原来的代码:
// 仅查询需要用到的id字段,不需要查全表字段,节省性能 $result = mysqli_query($link, "SELECT id FROM Owner WHERE id NOT IN (SELECT Ownerid FROM Owning)"); while($rowo = mysqli_fetch_array($result)) { $deleteId = $rowo['id']; // 对ID做转义处理,避免SQL注入风险 $deleteId = mysqli_real_escape_string($link, $deleteId); mysqli_query($link, "DELETE FROM Owner WHERE id = '{$deleteId}'"); }
注意这种方式如果待删除数据多的话,会产生大量数据库请求,性能远低于方案1,非必要不推荐。
注意事项
- 操作前建议先执行对应的SELECT语句确认待删除的记录范围,避免误删数据
- 如果你的表数据量很大,子查询性能不足的话,可以把NOT IN换成LEFT JOIN写法,性能更优:
DELETE o FROM Owner o LEFT JOIN Owning ow ON o.id = ow.Ownerid WHERE ow.Ownerid IS NULL
内容的提问来源于stack exchange,提问作者jacky
相关产品推荐
相关产品推荐

