多表更新(MySQL)

时间:2009-10-05 14:52:25

标签: mysql sql sql-update

我有一个关于多表更新(MySQL)的问题。考虑表t1和t2。 t1的PKEY是'tid',它是t2中的外键。在t2中有一个字段“qtyt2”,它依赖于表t1中名为“qtyt1”的字段。请考虑以下SQL语句:

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进行更新,后者本身也会更新。如果更新了两行,结果应返回2.

是否可以保证字段将按照它们在语句中出现的顺序更新(首先设置qtyt2然后设置qtyt1)?

是否有可能先设置qtyt1然后再设置qtyt2?

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

我发现如果我写了“UPDATE t1,t2”,那么只有t1会更新,但是在将语句更改为“UPDATE t2,t1”时一切正常。

2 个答案:

答案 0 :(得分: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 (在行集中)为“Some value ..”(而不是t2.qtyt2的新值)

答案 1 :(得分:0)

我不相信MySQL会保证更新发生的顺序。唯一重要的是当使用具有外键约束的InnoDB表时,文档明确指出订单不能保证,并且更新可能因此失败。在这种情况下,您应该使用单独的更新语句,这应该不是问题,因为您使用InnoDB隔离了事务。