我在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。就像没有提交更新一样。
有什么想法吗?
答案 0 :(得分:5)
1201
显示的数字(SELECT
)不是t1
的记录,而是来自两个表的JOIN
的行。如果两个id
不是UNIQUE
或PRIMARY 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
);