首先,创建触发器:AFTER UPDATE触发器失败
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,因为它是TRAPGER ON TAPPA)这就是我写这个IF条件的原因。
编辑::的Sentiero的
一个实例具有TAPPA的多个实例,这样的Sentiero的一个实例收集它的价值自己的 “节奏” 和 “lunghezza” TAPPA INSTANCES
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更新,设定速度= 2 IDtappa = 0其中)触发不工作。
注:OLD.tempo是NULL,SENTIERO.tempo不为空
但第二时间(上tappa更新,设定速度= 3,其中IDtappa = 0)触发工作。
派生数据计算上的Sentiero的 “节拍”,对于IDsentiero = 0,已经改变:8.5
似乎它做:7.5 - 2 3,如此看来它已被采取正确的条件。
注:OLD.tappa是NOT NULL,SENTIERO.tempo是NOT NULL
所以,问题是TAPPA.tempo
与示例查询关联的SENTIERO行的现有速度值是什么?您已经检查过以确保SENTIERO__HA__TAPPA中存在关联记录,对吗?更新的触发器应用于哪个表? –
检查数据;我也解释了触发器的行为, 给你一个更清洁的触发器 – FrancescoN
谢谢你。 '所以问题出在TAPPA.tempo的NULL值上,我的更新答案应该解决这个问题。 –