2012-08-08 123 views
6

我已經做了一些研究,但似乎沒有什麼符合我的需求。我有一個數據庫表,其中包含一些從web服務中獲取的數據。有條件的重複密鑰更新

用戶爲每個記錄執行一些任務,然後將其標記爲「已處理」。所以我有一個額外的db字段(不是基於我從WS獲得的數據)名爲「已處理」,默認情況下設置爲0,當用戶完成工作時爲1。

每天我檢查WS,如果狀態碼更改,我想更新行並設置回處理爲0(這樣用戶可以再次處理它)。

比方說,這是我的數據庫......

+------+------------+-------+------------+ 
| id | statuscode | foo | processed | 
+------+------------+-------+------------+ 
| 123 | 66   | bar | 1   | 
+------+------------+-------+------------+ 
  • 如果有不相同的密鑰(ID),我想插入新記錄的行。
  • 如果有一行使用相同的鍵和'富'更改我想更新除'處理'字段以外的任何值。
  • 如果有一些是使用相同的密鑰和的StatusCode更改行我想更新任何值和設定處理爲0

我認爲,對重複一些條件密鑰更新可以使它的工作,也許CASE或IF條件...我錯了嗎?任何建議都是很好的,在此先感謝!

+0

如何ü去檢測'FOO改變?你有自己的價值檢查它反對富列? – nawfal 2012-08-08 19:35:16

回答

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和狀態碼嗎? – nawfal 2012-08-08 20:26:40

+0

@nawfal:還有兩個?爲什麼?如果'foo'變化與否是無關緊要的,那麼'ELSE'部分將處理它。 – 2012-08-08 20:29:01

+0

只有當foo或狀態碼更改時,只有他希望其他字段可更新。看到我的答案,你會明白我在說什麼 – nawfal 2012-08-08 20:31:45

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)