试试这个:
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
代码应该是这样的:
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
请注意:此触发器将更新lunghezza
表中的值SENTIERO
,当任何行被插入到表中时,表中SENTIERO_HA_TAPPA
的所有IDsentiero
SENTIERO
值,而不仅仅是新插入的值IDsentiero
。
要仅更新表lunghezza
中新插入的值的值,请将 a 添加到触发器的语句中。像这样: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);
然后触发器将更新IDsentiero = 4
表中唯一SENTIERO
的值,而不是它的所有值。而lunghezza
其他IDsentiero
人的值将是NULL
s:
因此,您必须在任何插入之前创建表和触发器。然后对表进行插入,以便获得一致的数据。这就是它应该如何工作的方式。
就像在下面的演示中一样:
请注意:在这个答案的所有演示中,我只使用了与触发器相关的三个表,我还修改了两个字段inizio
,fine
在表中可以为空TAPPA
,因为您在该表中的插入子句具有NULL
这些列的值。