0

我必须在 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;

当我评论两个 CREATE VIEW都运行时......但我需要那个意见......所以,请帮助我!(在触发器之外创建视图?但我需要在每次更新时创建一个视图,因为 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 '发生变化,我想重新计算一个或多个'SENTIERO'更新后的 'tempo' 和 'lunghezza' '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        |  
4

1 回答 1

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
于 2013-04-27T20:09:02.347 回答