6

いくつかの調査を行いましたが、私のニーズに合うものはないようです。Web サービスから取得したデータを含むデータベース テーブルがあります。

ユーザーは各レコードに対していくつかのタスクを実行し、「処理済み」としてフラグを立てます。したがって、「処理済み」という名前の追加の db フィールド (WS から取得したデータに基づくものではない) があり、デフォルトでは 0 に設定され、ユーザーが作業を完了すると 1 に設定されます。

毎日私はWSをチェックし、ステータスコードが変更された場合は行を更新し、処理を0に戻します(ユーザーが再び処理できるようにします)。

これが私のデータベースだとしましょう...

+------+------------+-------+------------+
| id   | statuscode | foo   | processed  |
+------+------------+-------+------------+
| 123  | 66         | bar   | 1          |
+------+------------+-------+------------+
  • 同じキー (id) を持つ行がない場合は、新しいレコードを挿入します。
  • 同じキーと「foo」が変更された行がある場合、「処理済み」フィールド以外の値を更新したいと思います。
  • 同じキーとステータスコードが変更された行がある場合、任意の値を更新し、処理済みを 0 に設定したいと考えています。

いくつかの条件で ON DUPLICATE KEY UPDATE を使用すると、おそらくいくつかの CASE または IF 条件で機能する可能性があると思います...間違っていますか? どんな提案でも大歓迎です、事前に感謝します!

4

2 に答える 2

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) ;
于 2012-08-08T19:47:19.847 に答える
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)
于 2012-08-08T20:21:45.160 に答える