首页 > 解决方案 > 使用循环的多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 而不会影响数据库?或者有没有更好的方法来处理这个?

标签: phpmysql

解决方案


使用单个语句删除非常慢,但何时使用准备好的语句进行。

$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

推荐阅读