まず、トリガーを作成します。
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 値にあります