在触发器中创建视图

时间:2013-04-27 19:51:35

标签: mysql view triggers mysql-workbench

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

1 个答案:

答案 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