2013-06-05 114 views
0

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

+0

与示例查询关联的SENTIERO行的现有速度值是什么?您已经检查过以确保SENTIERO__HA__TAPPA中存在关联记录,对吗?更新的触发器应用于哪个表? –

+0

检查数据;我也解释了触发器的行为, 给你一个更清洁的触发器 – FrancescoN

+0

谢谢你。 '所以问题出在TAPPA.tempo的NULL值上,我的更新答案应该解决这个问题。 –

回答

0

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

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa 
AFTER UPDATE ON TAPPA 

触发器仅在更新表TAPPA后触发。

UPDATE SENTIERO 
SET tempo=null; 

你的测试查询更新表的Sentiero,并设置速度为null,这是由触发的IF条件过滤掉。在该表

UPDATE TAPPA 
SET tempo=5; 

该查询应引起的Sentiero的速度值即可设置为零,假设有一个速度值= 5:尝试更新TAPPA代替,像这样的!

请注意,看起来您的触发器会影响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块没有进入ERED。你正在比较一个非空值与空值。这产生空。您需要使用the null safe equality operator,<=>。您的IF语句应该如下所示:

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

好的,请原谅..错误的例子^^。它有效,但真正的问题是另一个问题。我会在2分钟内编辑问题。我希望你能帮助我,谢谢。 – FrancescoN

+0

问题更新,那是更新不起作用。 – FrancescoN

+0

@ Jimmy5nomana更新回答。 –

相关问题