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