MySQL更新连接未按预期工作

时间:2011-08-15 10:40:08

标签: mysql sql join transactions sql-update

我在ubuntu 12.10和MySQL Workbench上使用MySQL 5.1.41。

我有2个产品表,t1和t2。 t1是实时数据,t2是准备更新到t1的导入数据,用于更新所有新产品价格。所以我跑:

SELECT * FROM t1
JOIN t2 ON t1.id = t2.id
WHERE t1.price != t2.price;

这将返回价格不同且需要更新的1201条记录。所以我跑:

UPDATE t1 JOIN t2 ON t1.id = t2.id
SET t1.price = t2.price
WHERE t1.price != t2.price;

完成没有错误并报告1143行受影响,行匹配:1143更改:1143警告:0

所以这里已有的东西不对。选择查询中有1201条记录不同,但只有1143条使用相同的连接和条件进行了更改?

运行初始选择查询我希望看到58条记录仍然有不同的价格。但是当它运行时,我得到了与我最初相同的1201。就像没有提交更新一样。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

1201显示的数字(SELECT)不是t1的记录,而是来自两个表的JOIN的行。如果两个id不是UNIQUEPRIMARY KEY,那么这是预期的。 t1的某些行匹配t2的多行。但是当UPDATE完成时,它们只会更新一次(这是UPDATE的MySQL“特性”或“错误”,它会在更新语句中按顺序检查WHERE条件。

尝试此操作以查看应更新的行数(t1):

SELECT * FROM t1
WHERE EXISTS
      ( SELECT *
        FROM t2
        WHERE t1.id = t2.id
          AND t1.price != t2.price
      );