2013-03-19 84 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操作。