我做了一些研究,但似乎没有什么能满足我的需求。我有一个数据库表,其中包含从Web服务中恢复的一些数据。
用户为每条记录执行一些任务,然后将其标记为“已处理”。所以我有一个额外的db字段(不是基于我从WS获得的数据),名为“processed”,默认设置为0,当用户完成工作时为1。
每天我检查WS,如果状态代码更改我想更新行并设置回处理为0(这样用户可以再次处理)。
让我们说这是我的数据库...
+------+------------+-------+------------+
| id | statuscode | foo | processed |
+------+------------+-------+------------+
| 123 | 66 | bar | 1 |
+------+------------+-------+------------+
我认为ON DUPLICATE KEY UPDATE有一些条件可以使它工作,可能有一些CASE或IF条件......我错了吗?任何建议都很好,提前谢谢!
答案 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)