2013-03-19 101 views
1

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

最后更新查询是:

更新预订组发票=“12345”,其中用户名=“测试 - 用户名”和发票=“”;

因此,为以前未开具发票的测试用户名的所有订单设置发票至12345。

我遇到了订单被添加到PDF但未更新以反映它们已被开票的事实的问题。

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

客户可能有60个订单。

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

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

有没有人有任何明智的建议?

+0

你可以在这里添加一个'SELECT'查询,检查哪些记录应该受到影响(如'SELECT * FROM bookings WHERE username =:username AND invoiced =''') - 并记录其结果? – raina77ow 2013-03-19 15:50:15

+0

嗨 - 是的,这是奇怪的事情。如果我为完全相同的查询执行SELECT,那么我会看到完整的结果 - 例如60行。如果我然后运行一个更新,那么它只会做1或2. – Chris 2013-03-19 15:52:22

+0

好的,我假设在普通MySQL(例如,通过控制台)完成相同的查询运行正常...您可以显示代码本身吗? – raina77ow 2013-03-19 16:16:30

回答

1

我猜你在使用InnoDB。您尚未透露您正在运行的代码的类型。

但我敢打赌,你看到一个与交易有关的问题。当一个程序与交互式会话不同时,它通常是一个交易问题。

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

做的事情更好地工作,如果你在你UPDATE声明后立即发出命令COMMIT;

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

另一种方式来处理这个问题是发出SQL命令

SET autocommit = 1 

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