在触发器中创建视图 [英] Create View in a Trigger

查看:461
本文介绍了在触发器中创建视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

这篇关于在触发器中创建视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆