我试图将表中的列更新为与另一个表的列中的内容相同的列,作为数据仓库项目的非规范化过程的一部分。这些数据是保密的,所以为了给我提供一个例子,我将使用抽象表和列名。
我有三个表,称为A、B和C。A有15M行,是主要的数据立方体表,B和C是事实表,C是查找描述的表。表A的列dtype为1或0,其中1表示数据是实际的(来自实际事务的事实表),0表示数据是理论数据(来自预测)。如果我运行以下语句
UPDATE A SET desc = NULL; -- Just for clarity with regards to initial state
UPDATE A, B, C SET A.desc = C.desc WHERE B.id = A.b_id AND C.id = B.desc_id AND A.dtype=1
-- produces many warnings the last 64 of which are data truncation warnings
SELECT count(*)
FROM
A
JOIN B ON B.id = A.b_id
JOIN C ON C.id = B.desc_id
WHERE
A.dtype = 1
AND A.desc <> C.desc最后一个select语句返回计数的200,000+。这怎麽可能?
我使用的是MySQL版本5.1.67-0ubuntu0.11.10.1。所有的表都是MyISAM。
发布于 2013-04-10 15:08:24
结果表明,对于A和B之间的联接,有许多重复的匹配,而MySQL是以一种未定义但一致的方式从重复的连接中选择C.desc。在执行更新时,它会选择一个副本,但是当SELECTing选择另一个副本时。因此,选择不同的行将返回结果,但更新行将表示没有更改。
故事的寓意:不要忘记检查副本,因为MyISAM没有。
https://dba.stackexchange.com/questions/39650
复制相似问题