【问题标题】:Is this so bad when using MySQL queries in PHP?在 PHP 中使用 MySQL 查询时这很糟糕吗?
【发布时间】:2010-04-06 00:30:09
【问题描述】:

我需要根据用户请求更新很多行。这是一个有产品的网站。

我可以...

  • 删除该产品的所有旧行,然后遍历字符串以构建新的INSERT 查询。但是,如果 INSERT 失败,这将丢失所有数据。
  • 在每个循环中执行UPDATE。此循环目前迭代了 8 个以上的项目,但未来可能会达到 15 个。这么多 UPDATEs 听起来不是一个好主意。
  • 更改数据库架构,并将auto_increment Id 添加到行中。然后先执行SELECT,获取变量中的所有旧行 id,执行INSERT,然后执行DELETE WHERE IN SET

这里通常的做法是什么?

谢谢

【问题讨论】:

  • 这可能与PHP无关。这更像是一个设计问题。我认为你需要退后一步,重新审视你正在尝试做的事情。去给自己泡杯茶吧……:)
  • 我刚刚添加了 PHP 标记,因为我提到了循环等。可能对背景有帮助。另外,我不是喝茶/咖啡的人。也许我应该是!
  • 如果你想合并批量更新,你可以在临时表中插入一个键:值映射,然后更新你的目标表加入临时表。但是对于 8-15 的更新,这可能是浪费精力。

标签: php mysql


【解决方案1】:

只需进行更新。如果需要,在交易中。 15 次更新是小菜一碟,除非您在每次访问页面时都这样做。

您不想为了避免额外的查询而删除/重新插入行。如果您希望有一个外键来引用您正在更新的表,那么您将无法做到。

几乎可以肯定是过早的优化。

【讨论】:

  • 感谢 bobince。 过早的优化这件事确实让我跳出来了,但是循环中的UPDATE也触发了我的也许有更好的方法?
  • 只要是执行 15 次更新的实际循环,而不是您手动写出 15 条不同的更新语句。
【解决方案2】:

15 UPDATEs 真的没有那么多。如果你说的是 1500,那么也许你需要多考虑一下你的设计......

【讨论】:

    【解决方案3】:

    最佳实践可能是使用存储过程。
    http://dev.mysql.com/doc/refman/5.5/en/stored-routines.html
    它只是 PHP 端的一个命令。其余的将在 MySQL 服务器上实现。

    您也可以尝试使用 mysqli::multi-query 一次执行几个查询。
    http://php.net/manual/en/mysqli.multi-query.php

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多