【问题标题】:MySQL update join not working as expectedMySQL 更新连接未按预期工作
【发布时间】:2011-10-27 04:48:09
【问题描述】:

我在 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

所以这里已经有些不对劲了。 select查询中有1201条记录不同,但使用相同的连接和条件只有1143条改变?

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

有什么想法吗?

【问题讨论】:

  • 两个表项的 ID 相同?
  • t1.pricet2.price 列是否属于同一类型?
  • sllev 的意思(我认为)是:两个表中的 id 主键是什么?如果没有,那就是原因。
  • 是的,两个 id 列都是 PK 和相同的数据类型
  • 抱歉,我只是仔细检查了一下,t2.id 不是 PK 或 UNIQUE 并且包含重复项。

标签: mysql sql join transactions sql-update


【解决方案1】:

您的SELECT 显示的数字(1201)不是t1 的记录,而是来自两个表的JOIN 的行。如果两个id 不是UNIQUEPRIMARY KEYs,那么这是可以预料的。 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
      );

【讨论】:

  • 但是JOIN t2 ON t1.id = t2.id
  • @Tomalak:我认为尽管被称为ids,但其中一个不是唯一的。还有其他可能的解释吗?
  • 我现在看到两者都是PK。所以我更困惑,此外,显示Rows matched: 1143 Changed: 1143 但似乎没有提交更新的OP 细节更令人困惑。
  • 你为什么会认为 o.O
  • @ypercube 你是对的。我的 t2.id 未设置为 UNIQUE,而且我发现 t2 包含重复项。源 CSV 还包含这些重复的 id,所以我只是修复我的导入脚本来处理它,然后添加 UNIQUE 约束,它应该很好去。
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2012-03-31
  • 2019-05-28
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多