【问题标题】:Conditional ON DUPLICATE KEY UPDATE以重复键更新为条件
【发布时间】:2012-08-05 23:43:15
【问题描述】:

我进行了一些研究,但似乎没有什么适合我的需求。我有一个数据库表,其中包含从 Web 服务检索的一些数据。

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

每天我都会检查 WS,如果状态码发生变化,我想更新行并将处理设置回 0(以便用户可以再次处理)。

假设这是我的数据库...

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

我认为在某些条件下 ON DUPLICATE KEY UPDATE 可以使它工作,也许在某些 CASE 或 IF 条件下......我错了吗?欢迎任何建议,提前感谢!

【问题讨论】:

  • 你将如何检测foo 的变化?您是否有自己的价值来检查 foo 列??

标签: mysql conditional on-duplicate-key


【解决方案1】:

类似这样的事情(警告: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) ;

【讨论】:

  • 不应该再检查两个字段 foo 和 statuscode 吗?
  • @nawfal:还有两个?为什么?如果foo 更改与否无关紧要,则由ELSE 部分负责。
  • 只有当 foo 或 statuscode 改变时,他才希望其他字段可以更新。看到我的回答,你就明白我在说什么了
  • 但是没有插入/更新其他字段,而是foostatuscode
  • 嗯,我明白了。我假设可能有更多字段,而 OP 仅显示了一个示例。谢谢。
【解决方案2】:

这里对另一个答案稍作修改,应该这样做:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2016-02-11
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多