【发布时间】:2012-04-05 13:58:09
【问题描述】:
我正在尝试更新与较小索引表中的行相交的数据表中的行。这两个表在数据表的复合 PK 上连接,使用相同标准的解释选择表明索引使用正确,并且获取了正确的唯一行 - 但我仍然遇到更新问题。
当临时表中只有 1 行时,连接表上的更新工作正常,但是当我有更多行时,我得到 MySql Error 1175,并且我指定的 WHERE 条件均不被识别。
我知道我可以使用 SET SQL_SAFE_UPDATES=0 关闭安全模式,但谁能告诉我这里有什么我不明白的地方?为什么我的 WHERE 条件不被接受,为什么在我进行 NATURAL JOIN 时它甚至需要一个 where - 为什么这仅适用于右侧表 (MyTempTable) 中的一行?
守则
下面是大大简化的,但结构相同的创建表和更新代表我的问题。
——数据表。 创建表 MyDataTable ( KeyPartOne int 不为空, KeyPartTwo varchar(64) 不为空, KeyPartThree int 不为空, 相关数据 varchar(200) 空, 主键(KeyPartOne、KeyPartTwo、KeyPartThree) ) 引擎=InnoDB; -- 'Temp' 表。 创建表 MyTempTable ( KeyPartOne int 不为空, KeyPartTwo varchar(64) 不为空, KeyPartThree int 不为空, 主键(KeyPartOne、KeyPartTwo、KeyPartThree) )引擎=内存; -- 更新查询(在 Temp 表中只有 1 行可以正常工作) 更新 MyDataTable 自然加入 MyTempTable set RelevantData = '有意义的东西'; -- 指定 'where' - 产生与其他更新查询相同的效果 更新 MyDataTable mdt 加入 MyTempTable mtt 在 mdt.KeyPartOne = mtt.KeyPartOne 和 mdt.KeyPartTwo = mtt.KeyPartTwo 和 mdt.KeyPartThree = mtt.KeyPartThree 设置 RelevantData = '有意义的东西' 其中 mdt.KeyPartOne = mtt.KeyPartOne 和 mdt.KeyPartTwo = mtt.KeyPartTwo 和 mdt.KeyPartThree = mtt.KeyPartThree;附:当临时表仅包含一行时,上述两个更新语句都按预期工作,但是当有多行时给我错误。我真的很好奇为什么!
【问题讨论】:
标签: mysql join composite-key