2017-05-26 4 views
1

が存在する場合は、次のように、私はテーブルの上にトリガを作成し確認してください。例えばMySQLのトリガーは、行フィールドが

UPDATE tb SET color = 'red' WHERE id = 1; 

は更新がトリガが必要ですsizeフィールドが含まれていないので、何のフィールドが見つからなかったことを私にエラーを与えます。

私のトリガー機能に特定のROWフィールドが存在するかどうかを確認する方法があるかどうかを知る必要があります。これはどのように達成できますか?

IF EXISTS(ROW.size) THEN 

END IF; 
+1

達成しようとしていることについてもっと詳しく説明できますか?今のところあなたの質問は非常に曖昧です。 – peterm

+0

私は詳細な説明で更新しました – user2914191

+0

正確なエラーメッセージを投稿できますか? – peterm

答えて

1

エラーがUPDATEステートメントで参照される列とは関係ありません。

は私がと同等のものが必要。

大きな問題は、トリガー本体のsizeへの未修飾の参照です。 sizeに割り当てられた値の変更を検出する場合は、NEW.sizeの値とOLD.sizeの値を比較する必要があります。


DELIMITER $$ 

DROP TRIGGER IF EXISTS tb_ins $$ 

CREATE TRIGGER tb_ins 
BEFORE UPDATE ON tb 
FOR EACH ROW 
BEGIN 
    IF NOT (NEW.size <=> OLD.size) THEN 
     -- value of size column has been modified 
     BEGIN END; 
    END IF; 
END$$ 

それはTHENEND IFの間には何もありませんし、有効ではありません。私たちはそこに何かを持たなければなりません。 MySQLは空のBEGINEND;ブロックを許容しているので、これをノーオペレーションとして使用できます。

達成しようとしていることは明確ではありません。

+0

を吸います私は問題がそこになかったことを知っていたので、私は簡単にブロックを空のままにしました。私は特定の列の変更を検出しようとしています。あなたは '<=>' – user2914191

+1

を説明することができます '<=>'(宇宙船)演算子はNULL安全な比較を実行し、NULLを返す比較演算子 '012 '、''とは違って、NULL値との比較のためにTRUEまたはFALSEを返します。 NULLとの比較のために。式「a <=> b」は、式「IF(a = b OR(a IS NULLおよびb IS NULL)、1,0)」と同等です。トリガーで使用すると、NULLの変更やNULLからの変更を含めて、列の値の変更を検出するのに便利です。 – spencer7593

関連する問題