首先,创建触发器:
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/