更新TRIGGER失败后

时间:2013-06-05 15:58:21

标签: mysql triggers

首先,创建触发器

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa
AFTER UPDATE ON TAPPA
FOR EACH ROW
BEGIN

//NEW.tempo and OLD.tempo would refers to TAPPA "tempo" and "lunghezza", really? I ask you this because SENTIERO has it own "tempo" and "lunghezza"
IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

        UPDATE SENTIERO 
        SET tempo=0;

END IF;
END$$

然后,运行查询

UPDATE SENTIERO
SET tempo=null;

似乎TRIGGER不起作用,我不知道原因。

NEW.tempo和OLD.tempo可能为NULL (我猜他们引用TAPPA,因为它是TAPPA上的TRIGGER)这就是我编写IF条件的原因。


编辑::

SENTIERO的一个实例有多个TAPPA的实例,所以一个SENTIERO实例收集它自己的“节奏”和“lunghezza”TAPPA实例的值

IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

    IF (OLD.tempo is NOT NULL) THEN

            UPDATE SENTIERO
            SET tempo=tempo - OLD.tempo + NEW.tempo
            WHERE (tempo is NOT NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
                                                         FROM SENTIERO__HA__TAPPA AS sht
                                                         WHERE NEW.IDtappa=sht.IDtappa);
    ELSE

            UPDATE SENTIERO
            SET tempo=tempo + NEW.tempo
            WHERE (tempo is NOT NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
                                                          FROM SENTIERO__HA__TAPPA AS sht
                                                          WHERE NEW.IDtappa=sht.IDtappa);

            UPDATE SENTIERO
            SET tempo=NEW.tempo
            WHERE (tempo is NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
                                                      FROM SENTIERO__HA__TAPPA AS sht
                                                      WHERE NEW.IDtappa=sht.IDtappa); 
    END IF;


END IF;

但是当我尝试运行时

UPDATE TAPPA
SET tempo=9
WHERE IDtappa=0;
//where instance of IDtappa=0 has "tempo"'s value=NULL

它不起作用


表格数据:

SENTIERO              |    SENTIERO_HA_TAPPA       |  TAPPA
IDsentiero  time      |    IDsentiero  IDtappa     |  IDtappa  time    
   0         7.5      |        0          0        |     0      null      
                      |        0          1        |     1      1.45     
                      |        0          2        |     2      2.3   
                      |        0          5        |     5      1.45
                      |        0          8        |     8      2.3

第一次(在tappa上更新,设置tempo = 2,其中IDtappa = 0)触发器不起作用

注意:OLD.tempo为NULL,SENTIERO.tempo不为空

但是第二次(在tappa上更新,设置tempo = 3,其中IDtappa = 0)触发器正常工作

派生数据按照SENTIERO的“节奏”计算,IDsentiero = 0,已改变:8.5

它似乎已经完成了:7.5 - 2 + 3 ,所以它似乎已经采取了正确的条件。

注意:OLD.tappa为非空,SENTIERO.tempo为非空

所以问题在于TAPPA.tempo的NULL值

1 个答案:

答案 0 :(得分:0)

您的查询不会触发触发器。原因如下:

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa
AFTER UPDATE ON TAPPA

触发器仅在对表TAPPA进行更新后触发。

UPDATE SENTIERO
SET tempo=null;

您的测试查询正在更新表SENTIERO,并将tempo设置为null,这将由触发器的IF条件过滤掉。请尝试更新TAPPA,如下所示:

UPDATE TAPPA
SET tempo=5;

此查询应该使SENTIERO的速度值设置为零,假设该表中有一个速度值!= 5。

请注意,您的触发器似乎会影响SENTIERO中的每一行。也许你应该在两个表之间包含某种ID匹配?例如:

UPDATE SENTIERO 
SET tempo=0
WHERE SENTIERO.ID = NEW.ID;

回答新问题:

您的IF声明:

IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

您的测试查询:

UPDATE TAPPA
SET tempo=9
WHERE IDtappa=0;
//where instance of IDtappa=0 has "tempo"'s value=NULL

鉴于评论,很明显没有输入IF块。您将非空值与null进行比较。这会产生null。您需要使用the null safe equality operator<=>。你的IF语句应该是这样的:

IF (NEW.tempo is not null) and NOT (NEW.tempo<=>OLD.tempo) THEN