2017-12-29 29 views
0

テーブルには、id, filename, width, height, removed_atの画像が格納されています。 テーブルは時々幅と高さの更新を取得し、行は決して削除されません。削除は、removed_atセルをNULLからタイムスタンプに更新することによって処理されます。 私は別のテーブルch_servicesをセル上に外部キーと共に持っていますimageセルidch_imgテーブルにあります。 今度は、removed_atセルをch_imgに更新すると、imageセルがch_servicesに設定されてNULLに設定されます。 基本的に種類はON DELETE SET NULLですが、DELETEはありません。更新があります。しかしwidth/heightセルをch_imgに更新するとNullに設定したくないです。これをどうすれば処理できますか?MySQL ForeignKey:更新タイムスタンプでヌルを設定する

答えて

1

このようなタスクを処理するには、いくつかの方法があります。あなたが質問をする方法は、triggerを使用することがあなたのニーズに合っていることを示唆しています。これにより、ch_imgの変更を見て、条件付きで他のテーブルを更新するロジックを記述することができます。トリガのドキュメントは非常によく、多くの例があります。

あなたのコードは次のようになります:

delimiter | 

CREATE TRIGGER my_trigger BEFORE UPDATE ON ch_img 
    FOR EACH ROW 
    BEGIN 
    IF NEW.removed_at > 0 THEN 
     UPDATE ch_services SET img_id = NULL WHERE img_id = NEW.id; 
    END IF; 
    END; 
| 

delimiter ; 

しかし、あなたが考慮すべきトリガを使用しない理由があります。他のすべてのコードから離れて秘密の隠れ場所にビジネスロジックを記述していると考えてください。トリガーの追跡が失われたり、存在することさえ忘れたりするのは簡単です。

パフォーマンスを重視する場合を除き、すべてのロジックを1か所にまとめると、コードの保守が容易になると私は主張します。その場合は、コードに余分なクエリを書くだけで済みます。

私には強く反対する人もいます。

トリガーは間違いなく作業を完了しますが、プロセッサーのミリ秒がエンジニア時間以上の価値があるかどうかによって正しい答えが決まります。

+0

非常に良い回答です - ありがとうございます!私は初めてトリガーから聞くが、私はそれらが好きだ。しかし、私は、トリガーの追跡を非常に簡単に失う可能性があることに絶対に同意します。私はこれを扱うために外部キーにもっと簡単なオプションがあると思った。そうでない場合は、私のロジックを自分のコードに入れておくほうがよいでしょう。 – PhilHarmonie

関連する問題