【问题标题】:MySQL update not updating all recordsMySQL更新不更新所有记录
【发布时间】:2013-03-08 09:18:43
【问题描述】:

我有一个列出所有订单的数据库表。每个周末都会运行一个 cron,它会为每个客户生成发票。代码遍历每个客户,获取他们最近的订单,创建 PDF,然后更新订单表以记录每个订单的发票 ID。

最后的更新查询是:

update bookings set invoiced='12345' where username='test-username' and invoiced='';

因此,将 test-username 之前未开票的所有订单设置为 12345。

我遇到了一个问题,订单被添加到 PDF 中,但没有更新以反映已开票的事实。

我已经开始手动运行更新查询,遇到了一个奇怪的场景。

一个客户可能有 60 个订单。

如果我运行一次查询,则会更新 1 个订单。我再次运行它并更新了 1 个订单,我重复该过程,每次只更新少量订单 - 在 1 到 3 之间。它不会像我期望的那样在一个查询中更新 60 个。我需要重复运行查询,直到它最终返回“0 行受影响”,然后我可以确定所有行都已更新。

我的查询中没有包含 LIMIT XX,所以我没有理由不能一次更新所有订单。我重复运行的查询每次都是相同的。

大家有什么明智的建议吗?!

【问题讨论】:

  • 您能在此处添加一个SELECT 查询,以检查哪些记录应该受到影响(例如SELECT * FROM bookings WHERE username = :username AND invoiced = '') - 并记录其结果?
  • 嗨 - 是的,这很奇怪。如果我对完全相同的查询执行 SELECT,那么我会看到完整的结果 - 例如60 行。如果我然后运行更新,那么它只会执行 1 或 2。
  • 好的,我假设在普通的 MySQL 中(例如通过控制台)完成相同的查询运行正常......那么你能显示代码本身吗?
  • 嗨。是的,我一直在通过 phpMyAdmin 来确认 SELECT 和 UPDATE 正在执行我所说的操作。
  • 好吧,就像我说的,做这件事的代码在这里很有趣。

标签: mysql transactions commit


【解决方案1】:

我猜你正在使用 InnoDB。您还没有透露您正在运行的代码类型。

但我敢打赌,您看到的是与交易相关的问题。当程序与交互式会话的工作方式不同时,通常是事务问题。

请看这里:http://dev.mysql.com/doc/refman/5.5/en/commit.html

如果您在UPDATE 语句之后立即发出COMMIT; 命令,事情会更好吗?

请注意,您的语言绑定可能有自己的首选方式来发出COMMIT; 命令。

解决这个问题的另一种方法是发出 SQL 命令

 SET autocommit = 1

在您建立连接之后。这将使每个更改数据的 SQL 命令自动执行其 COMMIT 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多