多表更新(MySQL)

Posted

技术标签:

【中文标题】多表更新(MySQL)【英文标题】:Multi-table Update(MySQL) 【发布时间】:2009-10-05 14:52:25 【问题描述】:

我有一个关于多表更新(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”后一切正常。

【问题讨论】:

【参考方案1】:

首先,始终建议明确您的 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 的新值)

【讨论】:

【参考方案2】:

我认为 MySQL 不保证更新发生的顺序。无论如何,唯一重要的是在使用具有外键约束的 InnoDB 表时,文档特别指出不能保证顺序,因此更新可能会失败。在这种情况下,您应该使用单独的更新语句,这应该不是问题,因为您使用 InnoDB 获得的事务是隔离的。

【讨论】:

以上是关于多表更新(MySQL)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL,多表更新和奇怪的结果

mysql多表更新删除

mysql 多表联合更新

数据库MySQL中关于“多表关联更新”的那些事

mysql update多表相同列更新

mysql多表条件更新