php - 使用循环的多mysql删除功能
问题描述
我有一个函数,我使用 foreach 循环删除数据库中的多行。
这是下面的代码。
$ids = array(1, 3, 7, 8, 9, 32);
foreach ($ids as $id) {
$sql = mysql->query("DELETE FROM tablename WHERE id = '$id' " );
}
这适用于删除数组中具有 id 的所有行,但我的问题是,如果 id 超过 2000,这能有多有效,这样的循环是否可以处理数组中的数千个 id 而不会影响数据库?或者有没有更好的方法来处理这个?
解决方案
使用单个语句删除非常慢,但何时使用准备好的语句进行。
$query = "DELETE FROM tablename WHERE id = ?";
$sth = $pdo->prepare($query);
foreach($id in $ids) $sth->execute([$id]);
更好的是使用带有IN关键字的批量语句。
$ids = array(1, 3, 7, 8, 9, 32);
$in = join(',', $ids);
$query = "DELETE FROM tablename WHERE id IN ( $in )";
更新
最好在此处使用准备好的语句,如果不确定,ID 是否都是合法的
$ids = array(1, 3, 7, 8, 9, 32);
$marks = substr(str_repeat('?,', count($ids)), 0, -1);
$query = "DELETE FROM tablename WHERE id IN ( $marks )";
$sth = $dbo->prepare($query);
$sth->execute($ids);
当您有成千上万的数据要删除时,最好将它们分块。
如果要删除表的所有条目,则截断是最佳选择。
TRUNCATE tablename
推荐阅读
- java - 如何遍历 JSON 对象?
- javascript - javascript - 如何控制 HTML 音频元素的最小缓冲区大小?
- r - Rmd 在编织到 html 时提供未映射的内存
- javascript - Chrome“pageAction”未自动显示在 Chrome 主工具栏中
- python - 碰撞检测在玩家和敌人之间不起作用
- python - 如何对 float32 类型的张量应用“或”操作?
- r - 根据起点和终点识别模式
- javascript - 汉堡菜单到第二排
- python - 将一个 tf.data.Datasets 与另一个的所有其他元素合并
- asp.net-core - Blazor 中的依赖注入与 Razor 组件