【问题标题】:UPDATE affecting less rows than equivalent SELECTUPDATE 影响的行数少于等效的 SELECT
【发布时间】:2012-11-21 14:18:51
【问题描述】:

以下查询返回 2303 行:

SELECT a.* 
FROM cur_analises a
    INNER JOIN cur_materias_subsidiarias ms
    ON ms.materia_id = a.materia_id
    AND ms.subsidiaria_id IN(SELECT id FROM cur_subsidiarias WHERE cliente_id = 134)
    INNER JOIN cur_materias m
    ON m.id = a.materia_id
    INNER JOIN cur_clientes c
    ON c.carga_id = ms.subsidiaria_id
WHERE a.cliente_id = 134;

我需要使用来自cur_clientes.id 的值更新表cur_analises 中所有这2303 行的cliente_id 字段。但是,根据 MySQL Workbench,当我尝试将 SELECT 查询转换为以下 UPDATE 时,它只影响 2297 行:

UPDATE cur_analises a
    INNER JOIN cur_materias_subsidiarias ms
    ON ms.materia_id = a.materia_id
    AND ms.subsidiaria_id IN(SELECT id FROM cur_subsidiarias WHERE cliente_id = 134)
    INNER JOIN cur_materias m
    ON m.id = a.materia_id
    INNER JOIN cur_clientes c
    ON c.carga_id = ms.subsidiaria_id
SET a.cliente_id = c.id
WHERE a.cliente_id = 134;

我不知道为什么它缺少 6 行。我做错了什么?

【问题讨论】:

  • 其中六行是否已经具有您要设置的值?
  • 不,它们是auto_increment在上一个查询中生成的新id。

标签: mysql join sql-update


【解决方案1】:

您可能没有在查询中的某个点加入唯一值或一组值,从而导致结果集非规范化。然后,当您进行更新时,它只会更新实际满足别名为 a 的表的连接条件的行。只有您才能知道查询中真正的非非规范化联接并修复它们。

【讨论】:

  • 你是对的。原来要更新的正确行数是 2292,我差了 11 行。
  • 这件事要毁了我的一天,无声的诅咒开始了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2011-01-31
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多