条件ON DUPLICATE KEY UPDATE

时间:2012-08-08 19:25:14

标签: mysql conditional on-duplicate-key

我做了一些研究,但似乎没有什么能满足我的需求。我有一个数据库表,其中包含从Web服务中恢复的一些数据。

用户为每条记录执行一些任务,然后将其标记为“已处理”。所以我有一个额外的db字段(不是基于我从WS获得的数据),名为“processed”,默认设置为0,当用户完成工作时为1。

每天我检查WS,如果状态代码更改我想更新行并设置回处理为0(这样用户可以再次处理)。

让我们说这是我的数据库...

+------+------------+-------+------------+
| id   | statuscode | foo   | processed  |
+------+------------+-------+------------+
| 123  | 66         | bar   | 1          |
+------+------------+-------+------------+
  • 如果没有具有相同密钥(id)的行,我想插入新记录。
  • 如果有一行使用相同的密钥并且'foo'更改,我想更新除“已处理”字段之外的任何值。
  • 如果有一行具有相同的密钥和状态代码更改,我想更新任何值并将处理设置为0.

我认为ON DUPLICATE KEY UPDATE有一些条件可以使它工作,可能有一些CASE或IF条件......我错了吗?任何建议都很好,提前谢谢!

2 个答案:

答案 0 :(得分: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) ;

答案 1 :(得分: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)