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”子句,但它表示“错误语法”。。。为什么?
最佳答案
请改为:
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;
更新:
您必须从
lunghezza
表而不是从TAPPA
中获取SENTIERO
值的总和,这就是为什么您要获取NULL
值。最后的代码应该是这样的: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
注意:这个触发器将更新表
CREATE TRIGGER
中lunghezza
的值,当任何行被插入到表SENTIERO
中时,SENTIERO_HA_TAPPA
中的所有IDsentiero
,而不仅仅是新插入的SENTIERO
的值。要仅更新表
IDsentiero
中新插入值lunghezza
的IDsentiero
值,请在触发器的SENTIERO_HA_TAPPA
语句中添加一个WHERE S2.IDsentiero = NEW.IDsentiero
。这样地: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;
例如,如果创建三个表,则将数据插入到表中,然后创建该触发器。然后像这样在表中插入:
INSERT INTO `SENTIERO_HA_TAPPA` (`IDtappa`, `IDsentiero`) VALUES (14, 4);
然后触发器将只更新表
UPDATE
中SENTIERO_HA_TAPPA
的值,而不是所有值。其他IDsentiero = 4
的SENTIERO
值为lunghezza
s:Updated SQL Fiddle Demo。
因此,您必须在任何插入之前创建表和触发器。然后在表中进行插入,以便得到一致的数据。这就是它的工作原理。
就像下面的演示:
SQL Fiddle Demo。
注意:在这个答案中的所有演示中,我只使用了与触发器相关的三个表,而且我还修改了表中的两个字段
IDsentiero
,NULL
使其可以为空,因为您在该表中的insert子句对这些列具有inizio
值。