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获得的事务进行隔离。