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 回答