首先,创建触发器:

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的一个INSTANCE具有TAPPA的多个INSTANCE,因此SENTIERO的一个INSTANCE收集其自身的“ tempo”和“ 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为空,SENTIERO.tempo不为空

但是第二次触发(在tappa上更新,将tempo = 3设置为IDtappa = 0时)触发起作用。

根据SENTIERO的“速度”计算得出的数据,IDsentiero = 0,已更改为8.5

似乎已完成:7.5-2 +3,因此似乎已采取了正确的条件。

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

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

最佳答案

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

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa
AFTER UPDATE ON TAPPA


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

UPDATE SENTIERO
SET tempo=null;


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

UPDATE TAPPA
SET tempo=5;


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

请注意,您的触发器似乎会影响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

关于mysql - 更新触发后失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16944569/

10-13 01:12