我有一个列出所有订单的数据库表。每个周末都会运行一个 cron 并为每个客户生成发票。代码遍历每个客户,获取他们最近的订单,创建一个 PDF,然后更新订单表以记录每个订单的发票 ID。
最后的更新查询是:
更新预订集 invoiceed='12345' where username='test-username' and invoiced='';
因此,为 test-username 之前未开具发票的所有订单将开具发票设置为 12345。
我遇到了一个问题,订单被添加到 PDF 但没有更新以反射(reflect)它们已开具发票的事实。
我已经开始手动运行更新查询并遇到了一个奇怪的场景。
一个客户可能有 60 个订单。
如果我运行一次查询,则更新 1 个订单。我再次运行它并更新了 1 个订单,我重复该过程并且每次只更新少量订单 - 在 1 到 3 之间。它不会像我期望的那样在一个查询中更新 60 个。我需要重复运行查询,直到它最终返回“受影响的 0 行”,然后我可以确定所有行都已更新。
我的查询中没有包含 LIMIT XX,所以我没有理由不能一次更新所有订单。我重复运行的查询每次都是相同的。
有没有人有什么明智的建议?!
最佳答案
我猜您正在使用 InnoDB。您尚未透露正在运行的代码类型。
但我敢打赌您看到的是与交易相关的问题。当程序与交互式 session 的工作方式不同时,通常是事务问题。
参见此处:http://dev.mysql.com/doc/refman/5.5/en/commit.html
如果您在 UPDATE
语句之后立即发出 COMMIT;
命令,事情会更好吗?
请注意,您的语言绑定(bind)可能有其自己的首选方式来发出 COMMIT;
命令。
处理这个问题的另一种方法是发出 SQL 命令
SET autocommit = 1
在您建立连接之后。这将使每个更改数据的 SQL 命令自动执行其 COMMIT 操作。
关于MySQL更新不更新所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503905/