【问题标题】:mysql 1093 error subselect work-around improvementmysql 1093 错误子选择解决方法改进
【发布时间】:2014-07-28 03:48:44
【问题描述】:

以下 UPDATE 查询工作正常:

UPDATE product SET gcode = '9a8a'
WHERE gcode = '81cd'
AND NOT EXISTS (SELECT 1 FROM
    (SELECT 1 FROM product WHERE gcode = '9a8a') AS x
)

但使用额外的嵌套选择来解决 MySQL 错误:

1093: You can't specify target table 'product' for update in FROM clause

有没有办法在这种特殊情况下改进这个查询?

这个查询只是用一个新值更新具有指定值的字段的所有记录。但是如果它们已经是具有新值的记录,我不想更新。看来这可能是一种常见的情况。

【问题讨论】:

  • 可能是因为1?那是什么?
  • 当子查询和更新中的表不同时,我看不出你是如何得到这个错误的
  • 要么你因为某种原因没有显示完整的 sql,要么它不是 SQL。没有嵌套的select 1 from,SQl 似乎很好。
  • @FuzzyTree - 表名应该相同。修好了。

标签: mysql sql-update subquery


【解决方案1】:

没有嵌套选择应该没问题:

UPDATE product
    SET gcode = '9a8a'
    WHERE gcode = '81cd' AND
          NOT EXISTS (SELECT 1 FROM trans WHERE trans_gcode = '9a8a');

只有当子查询引用正在更新的表时才需要双重嵌套。

编辑:

嗯,你的编辑有一点不同。您可以使用left outer join

UPDATE product p LEFT OUTER JOIN
       trans t
       on trans_gcode = '9a8a'
    SET gcode = '9a8a'
    WHERE gcode = '81cd' AND t.trans_gcode is NULL;

【讨论】:

  • 抱歉,表名“trans”打错了,应该是“product”。在我原来的问题中修复了它。在 MySQL 中,不支持在更新时从同一个表中选择并产生 1093 错误。额外的子选择是一种解决方法。
猜你喜欢
  • 1970-01-01
  • 2011-07-16
  • 2011-05-27
  • 2012-01-18
  • 1970-01-01
  • 2014-01-26
  • 2011-07-15
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多