我必须在UPDATE TRIGGER中的UPDATE中使用一个视图(尚未创建,因为在UPDATE TRIGGER中需要它)。
所以这是我的代码:
CREATE TRIGGER lunghezza_sentiero_datoderivato_UPDATE2
AFTER UPDATE ON TAPPA
FOR EACH ROW
BEGIN
CREATE VIEW tempoOLD_NULL(IDsentiero, tempo) AS
SELECT IDsentiero, tempo
FROM SENTIERO
WHERE tempo IS NULL and SENTIERO.IDsentiero IN (SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);
CREATE VIEW lunghezzaOLD_NULL(IDsentiero, lunghezza) AS
SELECT IDsentiero, lunghezza
FROM SENTIERO
WHERE lunghezza IS NULL and SENTIERO.IDsentiero IN (SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);
IF (NEW.lunghezza<>OLD.lunghezza) and (NEW.lunghezza is not null) THEN
UPDATE SENTIERO
SET lunghezza=lunghezza - OLD.lunghezza + NEW.lunghezza
WHERE IDsentiero IN (SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa) and IDsentiero NOT IN (SELECT IDsentiero
FROM lunghezzaOLD_NULL);
UPDATE SENTIERO
SET lunghezza=NEW.lunghezza
WHERE IDsentiero IN (SELECT IDsentiero
FROM lunghezzaOLD_NULL);
END IF;
当我评论2创建视图所有运行...但我需要那些视图..所以,请帮助我! (在触发器外创建视图?但我需要在每次更新时创建一个视图,因为NULL值随时间变化)
表格和实例的附录:
CREATE TABLE IF NOT EXISTS `SENTIERO` (
`IDsentiero` INT(11) NOT NULL COMMENT 'identificativo del sentiero' ,
`lunghezza` FLOAT NULL COMMENT 'dato derivato' ,
`tempo` FLOAT NULL COMMENT 'dato derivato' ,
PRIMARY KEY (`IDsentiero`) );
CREATE TABLE IF NOT EXISTS `TAPPA` (
`IDtappa` INT(11) NOT NULL COMMENT 'identificativo tappa' ,
`lunghezza` FLOAT NULL COMMENT 'Lunghezza espressa in km' ,
`tempo` FLOAT NULL COMMENT 'La quantità di ore stimate per arrivare alla tappa' ,
PRIMARY KEY (`IDtappa`) );
CREATE TABLE IF NOT EXISTS `SENTIERO__HA__TAPPA` (
`IDtappa` INT(11) NOT NULL ,
`IDsentiero` INT(11) NOT NULL ,
PRIMARY KEY (`IDtappa`, `IDsentiero`) );
一个'TAPPA'可以包含在一个或多个'SENTIERO'中,一个'SENTIERO'包含一个或多个'TAPPA'。
每个'SENTIERO'都有一个或多个'TAPPA'的'tempo'和'lunghezza'之和。
因此,当'TAPPA'发生更新时,如果'TAPPA'的'tempo'和'lunghezza'发生了变化,我想重新计算一个'tempo'和'lunghezza'或更多'SENTIERO'更新的'TAPPA'与。▼相关
请参阅'SENTIERO'具有自己的'TAPPA'的总和
SENTIERO | SENTIERO_HA_TAPPA | TAPPA
IDsentiero tempo lunghezza | IDsentiero IDtappa | IDtappa tempo lunghezza
0 3 20 | 0 1 | 1 3 20
1 8 35 | 1 1 | 2 5 15
| 1 2 |
答案 0 :(得分:1)
不要为此目的使用视图。这不是他们的目的。
相反,请学习如何正确连接表格:
CREATE TRIGGER lunghezza_sentiero_datoderivato_UPDATE2
AFTER UPDATE ON TAPPA
FOR EACH ROW
IF (NEW.lunghezza <> OLD.lunghezza) AND (NEW.lunghezza IS NOT NULL) THEN
-- note that this condition will not be entered if `OLD.lunghezza` IS NULL
-- irrespective of NEW.lunghezza. Perhaps you want to use the NULL-safe
-- equality operator <=> instead?
UPDATE SENTIERO AS s
JOIN SENTIERO__HA__TAPPA AS sht USING (IDsentiero)
SET s.lunghezza = CASE
WHEN s.lunghezza IS NULL THEN NEW.lunghezza
ELSE s.lunghezza - OLD.lunghezza + NEW.lunghezza
END
WHERE sht.IDtappa = NEW.IDtappa;
END IF