【问题标题】:MySQL/PHP mass delete using array: Best method?MySQL/PHP 使用数组批量删除:最好的方法?
【发布时间】:2014-08-04 04:18:11
【问题描述】:

我需要通过 PHP(使用 PDO)从 MySQL 表中进行批量删除。该表有一个名为“id”的字段,所有要删除的 id 都存储在一个数组中。可能有 5 行要从表中删除,也可能有 5000+。

我的直接想法是使用 foreach 并遍历数组,一次删除一个。但是有些事情告诉我,如果数组中有很多元素,这可能不是一个很好的方法。

对进行此类删除的最佳方法有什么想法吗?

【问题讨论】:

  • 使用IN:DELETE FROM table WHERE id IN (1,2,3,4,5)
  • @mcryan 是对的。但是,老实说,为 SQL 删除命令迭代 5,000 多个包含 SQL 记录 ID 的数组元素并不会真正损害性能,除非您计划将该过程集成到高流量域上的公共用户界面中。基本上,您可能需要 10 秒。这不是一件坏事。当用户等待 10 秒时,这很糟糕。您还可以遍历数组并构建查询字符串。在某些情况下,使用带 OR 的 where 子句比使用 IN 的性能更好。如果性能很重要,请进行测试。

标签: php mysql arrays


【解决方案1】:

使用以下查询将table_name 替换为表的名称。 $listofIdsToDelete是爆破ids数组得到的逗号分隔字符串

$query = "DELETE FROM `table_name` WHERE id IN ($listofIdsToDelete)";

编辑:

如果你做好准备,你会得到更好的表现:

$pQuery = "DELETE FROM table_name WHERE id = ?" 

并在循环中绑定每个id项并执行。

感谢 UselessIntern 的以下更正以及在答案中包含此评论的建议

【讨论】:

  • 这是一个数组,使用 implode(',' , $listofIdsToDelete) 代替。
  • 如果你准备 $pQuery = "DELETE FROM table_name WHERE id = ?" 你会得到更好的性能并绑定数组中的每一项
  • 啊,所以将这些信息添加到您的答案中。至少对我来说,一目了然。
  • 谢谢!不知道 IN,我想知道是否有准备好的声明方式来做这件事……会调查一下。
【解决方案2】:

使用WHERE IN:

$ids = array(1,2,3,5,6,7);
$db->exec('DELETE from table WHERE id IN ?', [implode(',' $ids)]);

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2011-01-16
    • 2021-04-25
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多