我必须在UPDATE TRIGGER内的UPDATE中使用视图(尚未创建,因为在UPDATE TRIGGER中需要它).
I have to use a view (not already created, because it's needed within that UPDATE TRIGGER) in an UPDATE inside an 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;当我评论两个CREATE VIEW 都在运行时...但是我需要该视图..所以,请帮帮我! (在触发器之外创建视图吗?但是我需要在每次更新时都创建一个视图,因为NULL值会随时间变化)
When i COMMENT both 2 CREATE VIEW all runs... but i need that views.. so, please help me! (create view outside the trigger? but i need to create a view on every update, because the NULL value change along the time)
表和示例的附录:
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'
One 'TAPPA' can be included in one or more 'SENTIERO', one 'SENTIERO' includes one or more 'TAPPA'. Each 'SENTIERO' has the sum of 'tempo' and 'lunghezza' of its one or more 'TAPPA'. So when occurs an update on 'TAPPA', if 'tempo' and 'lunghezza' of that 'TAPPA' have changed, i want to re-calculate the 'tempo' and 'lunghezza' for the one or more 'SENTIERO' the updated 'TAPPA' is related to. See, 'SENTIERO' has the SUM of its own '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 |推荐答案
请勿为此目的使用视图.这不是他们想要的.
Don't use views for this purpose. It's not what they're intended for.
相反,了解如何正确连接表:
Instead, learn how to join tables properly:
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更多推荐
在触发器中创建视图
发布评论