错误 1093:MySQL 无法在 FROM 子句中指定更新的目标表
Posted
技术标签:
【中文标题】错误 1093:MySQL 无法在 FROM 子句中指定更新的目标表【英文标题】:error 1093: MySQL can’t specify target table for update in FROM clause 【发布时间】: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 收到错误,因为它之前有一个;
【参考方案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
IDsentiero
在SENTIERO
中,而不仅仅是新插入的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);
那么触发器将只更新表SENTIERO
中IDsentiero = 4
的值,而不是它的所有值。而其他IDsentiero
的lunghezza
的值将是NULL
s:
因此,您必须在任何插入之前创建表和触发器。然后对表进行插入,以便获得一致的数据。这就是它应该如何工作的方式。
就像下面的演示:
SQL Fiddle Demo。注意:在这个答案的所有演示中,我只使用了与触发器相关的三个表,还修改了inizio
、@987654351这两个字段@ 在表 TAPPA
中可以为空,因为您在该表中的插入子句对这些列具有 NULL
值。
【讨论】:
'WHERE' 子句呢? @Jimmy5nomana 这与使用您在编辑中发布的IN
谓词和WHERE
子句的查询相同。 INNER JOIN
类似于IN
谓词,并且WHERE
子句中的条件移动到JOIN
的ON
条件。你试过吗?
我是一个初学者,这对我来说并不容易理解,我会尝试,但是没有机会使用'WHERE'子句吗? ^^
@Jimmy5nomana 你想为这个表中的每个IDsentiero
做这个吗?还是这个值SUM(lunghezza)
会一样?
@Jimmy5nomana 如果您想用相同的值SUM(lunghezza)
更新所有行的此列lunghezza
,则不需要WHERE
子句,并使用SELECT
里面SELECT
。如果没有,并且您想将每个分组 IDsentiero
的值 lunghezza
更新为 = SUM(lunghezza)
,那么您不能使用 WHERE
子句来执行此操作,唯一的方法是使用 INNER JOIN
跨度>
以上是关于错误 1093:MySQL 无法在 FROM 子句中指定更新的目标表的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表
MySQL错误1093 - 无法在FROM子句中指定更新的目标表
MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)
MySQL错误1093 - 无法在FROM子句中指定更新的目标表
MySQL 5.7 错误 (1093: You can't specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用