【问题标题】:error 1093: MySQL can’t specify target table for update in FROM clause错误 1093:MySQL 无法在 FROM 子句中指定更新的目标表
【发布时间】:2013-01-17 20:17:02
【问题描述】:

error 1093: MySQL can’t specify target table 'SENTIERO' for update in FROM clause

这是我的触发器:

CREATE TRIGGER lunghezza_sentiero_datoderivato_INSERT
AFTER INSERT ON SENTIERO_HA_TAPPA
FOR EACH ROW

BEGIN

UPDATE SENTIERO
SET lunghezza= (SELECT SUM(lunghezza)
                FROM TAPPA, SENTIERO as S2, SENTIERO_HA_TAPPA
                WHERE NEW.IDsentiero=S2.IDsentiero
                and SENTIERO_HA_TAPPA.IDtappa=TAPPA.IDtappa);
WHERE IDsentiero IN (SELECT IDsentiero
                     FROM TAPPA, SENTIERO, SENTIERO_HA_TAPPA
                     WHERE SENTIERO_HA_TAPPA.IDsentiero=SENTIERO.IDsentiero
                     and NEW.IDtappa=SENTIERO_HA_TAPPA.IDtappa);
END$$

我发现这篇文章关于这个问题,检查它
http://verysimple.com/2011/03/30/mysql-cant-specify-target-table-for-update-in-from-clause/

这是我唯一的机会吗? 请帮帮我

编辑:: 我刚刚添加了“WHERE”子句,但它向我发出“错误语法”的信号……为什么?

【问题讨论】:

  • 您从 WHERE 收到错误,因为它之前有一个 ;

标签: mysql sql triggers mysql-workbench mysql-error-1093


【解决方案1】:

试试这个:

UPDATE SENTIERO s
INNER JOIN
(
   SELECT IDsentiero, TheSum
   FROM
   (
      SELECT S2.IDsentiero, SUM(s2.lunghezza) AS TheSum
      FROM SENTIERO AS S2 
      INNER JOIN SENTIERO_HA_TAPPA AS st ON st.IDsentiero = S2.IDsentiero
      INNER JOIN TAPPA             AS  t ON st.IDtappa    = t.IDtappa
      GROUP BY S2.IDsentiero
   ) AS Sub
) AS s2 ON s.IDsentiero  = s2.IDsentiero 
SET s.lunghezza = s2.TheSum
WHERE S2.IDsentiero = NEW.IDsentiero;

更新:

您必须从TAPPA 表中而不是从SENTIERO 中获得lunghezza 的值的总和,这就是您获得NULL 值的原因。所以最终的CREATE TRIGGER 代码应该是这样的:

CREATE TRIGGER lunghezza_sentiero_datoderivato_INSERT
AFTER INSERT ON SENTIERO_HA_TAPPA
FOR EACH ROW

BEGIN

  UPDATE SENTIERO s
  INNER JOIN
  (
     SELECT IDsentiero, TheSum
     FROM
     (
        SELECT S2.IDsentiero, SUM(t.lunghezza) AS TheSum
        FROM SENTIERO AS S2 
        INNER JOIN SENTIERO_HA_TAPPA AS st ON st.IDsentiero = S2.IDsentiero
        INNER JOIN TAPPA             AS  t ON st.IDtappa    = t.IDtappa
        GROUP BY S2.IDsentiero
     ) AS Sub
  ) AS s2 ON s.IDsentiero  = s2.IDsentiero 
  SET s.lunghezza = s2.TheSum;

END

SQL Fiddle Demo

注意:当任何行被插入到表 SENTIERO_HA_TAPPA 中时,此触发器将更新表 SENTIERO 中的值 SENTIERO_HA_TAPPA IDsentieroSENTIERO中,而不仅仅是新插入的IDsentiero的值。

要仅将lunghezza 的值更新为IDsentiero 的新插入到表SENTIERO_HA_TAPPA 中,请将WHERE S2.IDsentiero = NEW.IDsentiero 添加到触发器的UPDATE 语句中。像这样:

CREATE TRIGGER lunghezza_sentiero_datoderivato_INSERT
AFTER INSERT ON SENTIERO_HA_TAPPA
FOR EACH ROW

BEGIN

  UPDATE SENTIERO s
  INNER JOIN
  (
     SELECT IDsentiero, TheSum
     FROM
     (
        SELECT S2.IDsentiero, SUM(t.lunghezza) AS TheSum
        FROM SENTIERO AS S2 
        INNER JOIN SENTIERO_HA_TAPPA AS st ON st.IDsentiero = S2.IDsentiero
        INNER JOIN TAPPA             AS  t ON st.IDtappa    = t.IDtappa
        GROUP BY S2.IDsentiero
     ) AS Sub
  ) AS s2 ON s.IDsentiero  = s2.IDsentiero 
  SET s.lunghezza = s2.TheSum
  WHERE S2.IDsentiero = NEW.IDsentiero;

END;

例如,如果您创建三个表,然后将数据插入到表中,然后创建该触发器。然后像这样插入表SENTIERO_HA_TAPPA

INSERT INTO `SENTIERO_HA_TAPPA` (`IDtappa`, `IDsentiero`) VALUES (14, 4); 

那么触发器将只更新表SENTIEROIDsentiero = 4的值,而不是它的所有值。而其他IDsentierolunghezza 的值将是NULLs:

因此,您必须在任何插入之前创建表和触发器。然后对表进行插入,以便获得一致的数据。这就是它应该如何工作的方式。

就像下面的演示:


注意:在这个答案的所有演示中,我只使用了与触发器相关的三个表,还修改了inizio、@987654351这两个字段@ 在表 TAPPA 中可以为空,因为您在该表中的插入子句对这些列具有 NULL 值。

【讨论】:

  • 'WHERE' 子句呢?
  • @Jimmy5nomana 这与使用您在编辑中发布的IN 谓词和WHERE 子句的查询相同。 INNER JOIN 类似于IN 谓词,并且WHERE 子句中的条件移动到JOINON 条件。你试过吗?
  • 我是一个初学者,这对我来说并不容易理解,我会尝试,但是没有机会使用'WHERE'子句吗? ^^
  • @Jimmy5nomana 你想为这个表中的每个IDsentiero 做这个吗?还是这个值SUM(lunghezza) 会一样?
  • @Jimmy5nomana 如果您想用相同的值SUM(lunghezza) 更新所有行的此列lunghezza,则不需要WHERE 子句,并使用SELECT里面SELECT。如果没有,并且您想将每个分组 IDsentiero 的值 lunghezza 更新为 = SUM(lunghezza),那么您不能使用 WHERE 子句来执行此操作,唯一的方法是使用 INNER JOIN跨度>
猜你喜欢
  • 2014-07-19
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多