2009-10-05 84 views
2

我有一個關於多表更新(MySQL)的問題。考慮表t1和t2。 t1中的PKEY是'tid',它是t2中的外鍵。在t2中有一個字段「qtyt2」,它取決於表t1中一個名爲「qtyt1」的字段。請看下面的SQL語句:多表更新(MySQL)

UPDATE t2,t1 
    SET t2.qtyt2=IF((t2.qtyt2- t1.qtyt1)<0,0,(t2.qtyt2- t1.qtyt1)), 
     t1.qtyt1 ="Some value.." 
WHERE t2.tid="some value.." 
    AND t2.tid=t1.tid 

在這個例子中qtyt2取決於qtyt1進行更新,而後者本身就是updated.Now結果應該返回2,如果兩行被更新。

是否有保證字段會按語句出現的順序進行更新(首先設置qtyt2,然後設置qtyt1)?

是否有可能首先設置qtyt1然後設置qtyt2?

語句中表的順序是否重要(UPDATE t2,t1或UPDATE t1,t2)?

我發現如果我寫了「UPDATE t1,t2」,那麼只有t1會得到更新,但是在將語句更改爲「UPDATE t2,t1」時一切正常。

回答

2

首先,明確建議您加入JOIN。第二,我認爲你的情況有一個錯字,應該是WHERE t2.qtyt2='Some value..'。所以:

UPDATE t2 JOIN t1 ON (t2.tid=t1.tid) 
SET t2.qtyt2= IF((t2.qtyt2- t1.qtyt1)<0, 0,(t2.qtyt2- t1.qtyt1)), 
    t1.qtyt1 ="Some value.." 
WHERE t2.qtyt2="Some value.."; 

如果上面的是你的意思,那麼我相信應該發生的是,SQL會發現該行設置好t2.qtyt2="Some value..",那麼它將更新t2.qtyt2,然後它會設置所有T1 .qtyt1(在行集合中)爲「某些值..」(而不是t2.qtyt2的新值)

0

我不相信MySQL保證任何關於更新將發生的順序。無論如何,唯一重要的是使用帶有外鍵約束的InnoDB表,並且文檔明確指出訂單不能保證,並且更新可能因此失敗。在這種情況下,您應該使用單獨的更新語句,這不應該成爲問題,因爲您將使用InnoDB獲得的事務進行隔離。