2012-08-08 24 views
6

私はいくつかの調査をしましたが、私のニーズに合うものはありません。私は、Webサービスから取得したいくつかのデータを含むデータベーステーブルを持っています。条件付き重複キー更新

ユーザーは各レコードに対していくつかのタスクを実行し、それを「処理済み」としてフラグを立てます。だから私は追加のDBフィールド(私はWSから取得するデータに基づいていない) "処理"は、デフォルトで0に設定されていると、ユーザーが彼の仕事をしたときに1になります。

毎日私はWSをチェックして、ステータスコードを変更して行を更新し、処理した値を0に戻して(ユーザーが再度処理できるように)

のは、これが私のデシベルであるとしましょう

...同じキー(ID)私は新しいレコードを挿入すると、行が存在しない場合は

+------+------------+-------+------------+ 
| id | statuscode | foo | processed | 
+------+------------+-------+------------+ 
| 123 | 66   | bar | 1   | 
+------+------------+-------+------------+ 
  • 同じキーを持つ行があり、 'foo'が変更された場合、 'processed'フィールドを除くすべての値を更新します。
  • 私は0

に加工任意の値と設定を更新する同じ鍵とからstatusCode変更に行があれば、私は多分いくつかと、いくつかの条件でON DUPLICATE KEY UPDATEはそれを動作させることができることを考えますCASEまたはIF条件...私は間違っていますか?どんな提案も前もってありがたいことです!このような

+0

がどのようにuは 'FOOを検出しようとしています'変更? urselfがfooカラムに対してチェックする価値がありますか? – nawfal

答えて

7

何か(警告:のNULL値ではない世話):ここでは別の答えの

INSERT INTO tableX 
    (id, statuscode, foo, processed) 
VALUES 
    (?, ?, ?, DEFAULT) 
ON DUPLICATE KEY UPDATE 
    processed = CASE WHEN statuscode <> VALUES(ststuscode) 
        THEN 0 
        ELSE processed 
       END 
, statuscode = VALUES(statuscode) 
, foo = VALUES(foo) ; 
+0

フィールドfooとstatuscodeのチェックをもう2回行うべきではありませんか? – nawfal

+0

@nawfal:もう2つ?どうして? 'foo'が変更されたかどうかは無関係ですが、' ELSE'部分が注意します。 –

+0

fooまたはステータスコードが変更された場合のみ、彼は他のフィールドを更新可能にします。私の答えを参照してください、あなたは私が話しているものを理解するでしょう – nawfal

1

わずかな変更は、これは実行する必要があります。

INSERT INTO tableX (id, statuscode, foo, processed) 
      VALUES (@id, @statuscode, @foo, @processed) 
ON DUPLICATE KEY UPDATE 
         foo = IF (statuscode != VALUES(statuscode) OR foo != VALUES(foo), VALUES(foo), foo), 
         statuscode = IF (statuscode != VALUES(statuscode) OR foo != VALUES(foo), VALUES(statuscode), statuscode), 
         processed = IF (statuscode != VALUES(statuscode), 0, processed)