2012-08-08 134 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)