2016-09-07 14 views
1

MySQLのV 5.6MySQLのトリガ:列が更新の一部ではありませんがnull

こんにちはありませんが、私はUPDATE BEFOREトリガーに問題がある:テーブルの上に、私はtinyint型、NOT NULLとしてフラグdefiendを持っています、デフォルト値1。私は行が更新された場合は常に、このフラグを1に設定するbefore update triggerを持っています。しかし、私はまた、明示的に0にフラグを設定するために、1つのプロセスで必要なので、私は

create trigger t BEFORE UPDATE on table for each row 
BEGIN 
IF new.flag is NULL THEN 
    set new.flag = 1 
END IF; 

問題ことを試してみました:new.flagがnullになることはありません。 Iは、更新クエリ内のフラグを含めずにテーブルを更新するたびに

IF new.flag is NULL THEN 
    set new.flag = 1 
ELSEIF new.flag = 0 THEN 
    set new.flag = 3 
END IF; 

でチェックが3に列を設定します。さらに悪いことに、私が使用している場合(「」= 0)、trueを返す選択として、1にフラグを置くために、空の文字列に対してチェックすることはできません。

IF new.flag is NULL OR new.flag = '' THEN 
    set new.flag = 1 
END IF; 

私は明示的に0にフラグを設定することはできません。 NEWでは、更新の一部ではない列をnullにする必要はありませんか?私は何をすることができます、それは変更するMySQLの設定ですか?

おかげ

+2

'new'は、行が更新後に持つ値を含みます(前に' old'があります)。あなたがあなたのクエリでそれを設定しないと、それは前に持っていた値を持ちます( 'new'はあなたの更新クエリで使用したカラムのリストではありません)。たとえば、 update-queryの 'set flag = 3'を、トリガーで0に設定したいマーカーとして指定します。または、ロジックを変更したい場合があります。一般的な更新マーカーは次のとおりです。 'timestamp'フィールドに' on update current_timestamp'を追加します。 – Solarflare

+0

@Solarflare ha、偽の値を設定してから0に設定すると、次のようになります。IF new.flag_indexation_required = 3その後、 が新規に設定されます。flag_indexation_required = 0; ELSE セットnew.flag_indexation_required = 1; END IF;私はそれを受け入れることができるようにあなたの答えを追加できますか? – jlb

答えて

1

NEW行が、更新後に明示的に更新クエリで使用されるだけではなく値を持つことになり、すべての列の値が含まれています。

明示的に値をリセットするように指示するには、使用されていない(ただし有効な)値を使用して情報をマークし、トリガーに応じて行動します(たとえば、

IF new.flag = -1 THEN 
    set new.flag = 0; 
ELSE 
    set new.flag = 1; 
END IF; 

次に、あなたのupdateクエリで、

update table set flag = -1; 

は、0に他の値を値を設定します、あるいはまったくクエリでその列を使用していない、に設定されます)TINYINTを締結3210。

トリガーなしの代替の、より一般的なアプローチがあります。これは、あなたのフラグに似ています。あなたは他の値がflag = 1と同じ意味を持つことになり、flag = 0と同じ意味を持つことになり、このコラムではコラム

last_update datetime default null on update current_timestamp; 

nullを使用することができます。それらは自動的に設定されます。あなたの「フラグ」をリセットしたい場合は、あまりにも完全に罰金

update table set last_update = null; 

コースワークのあなたのトリガアプローチの意志を使用することができます。その動作をどこかに記録するようにしてください。

関連する問題