多表更新(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)的主要内容,如果未能解决你的问题,请参考以下文章