如果符合某个条件,我INSERT
和ON 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)
。疯了吧?!
答案 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没有提供说“在满足此条件时更新所有这些内容”的方法。