INSERT ... ON DUPLICATE KEY UPDATE row IF date_added> VALUES(DATE_ADDED)

时间:2016-09-03 12:28:14

标签: mysql insert duplicates insert-update

如果符合某个条件,我INSERTON DUPLICATE KEY如何更新整行? 如果row早于VALUES(date_added),则我希望更新整个date_added

我看过这篇文章:

https://thewebfellas.com/blog/conditional-duplicate-key-updates-with-mysql

INSERT INTO daily_events
  (created_on, last_event_id, last_event_created_at)
VALUES
  ('2010-01-19', 23, '2010-01-19 10:23:11')
ON DUPLICATE KEY UPDATE
  last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id),
  last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);

但这不是编写语句的灵活方式。

稍后编辑:

首先,因为将对要更新的每个字段评估条件,其次,因为您必须注意在更新条件列的位置,在语句的最后位置。否则会导致UPDATE出错。

更确切地说,我希望这句话,我已经颠倒了两条UPDATE行,也是有效的:

INSERT INTO daily_events(created_on, last_event_id, last_event_created_at) VALUES('2010-01-19', 23, '2010-01-19 10:23:11') ON DUPLICATE KEY UPDATE last_event_created_at = GREATEST(last_event_created_at, VALUES(last_event_created_at)), last_event_id = (CASE WHEN last_event_created_at < VALUES(last_event_created_at) THEN VALUES(last_event_id) ELSE last_event_id END);

这是不可能的,因为:

  

使用此方法时要记住的一件重要事情是更新字段的顺序非常重要。我错误地认为,在整个查询被MySQL解释后,更新发生在一次批量分配中。但它们不是:分配按照它们在查询中出现的顺序发生。

     

使用较新的事件执行update时,last_event_created_at字段将会更新,但last_event_id字段不会更新。这是因为在评估第二个IF时,last_event_created_at已经更新,因此last_event_created_at等于VALUES(last_event_created_at)。疯了吧?!

1 个答案:

答案 0 :(得分:1)

你的查询似乎做你想要的,所以我不完全理解这个问题。您可以使用GREATEST()

来简化它
INSERT INTO daily_events(created_on, last_event_id, last_event_created_at)
    VALUES('2010-01-19', 23, '2010-01-19 10:23:11')
ON DUPLICATE KEY UPDATE
  last_event_id = (CASE WHEN last_event_created_at < VALUES(last_event_created_at) THEN VALUES(last_event_id) ELSE last_event_id END),
  last_event_created_at = GREATEST(last_event_created_at, VALUES(last_event_created_at));

CASE的使用是ANSI标准的优先选择,用于等效功能。)

MySQL没有提供说“在满足此条件时更新所有这些内容”的方法。