0

まず、トリガーを作成します

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 を参照していると思います)。これが、IF 条件を記述した理由です。


編集 ::

SENTIERO の 1 つの INSTANCE には TAPPA の複数の INSTANCE が含まれているため、SENTIERO の 1 つの INSTANCE は、自身の「tempo」と「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 で更新、IDtappa=0 で tempo=2 を設定) 、トリガーが機能しません

注: OLD.tempo は NULL です。SENTIERO.tempo は null ではありません。

しかし、2 回目(tappa での更新、IDtappa=0 で tempo=3 を設定) では、トリガーが機能します。

IDsentiero=0 の場合、SENTIERO の「テンポ」で計算された派生データ: 8.5が変更されました。

7.5 - 2 +3になっているようですので、正しい条件で撮影されているようです。

注: OLD.tappa は NOT NULL、SENTIERO.tempo は NOT NULL です

したがって、問題は TAPPA.tempo の NULL 値にあります

4

1 に答える 1