INSERT ...在WHERE的重复键更新?

And*_*and 40 mysql replication

我正在做一个INSERT ... ON DUPLICATE KEY UPDATE但是我需要更新部分是有条件的,只有在某些额外条件发生变化时才进行更新.

但是,WHERE不允许这样做UPDATE.这有什么解决方法吗?

我不能组合INSERT/UPDATE/SELECT,因为这需要在复制上工作.

小智 61

我建议你使用IF()来做到这一点.

请参阅:condition-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);
Run Code Online (Sandbox Code Playgroud)

  • 我从来不知道我可以访问更新部分内的原始表值。这可能解决了我的问题(尽管我以前的工作非常好:)) (2认同)
  • MySQL 可能会抱怨“字段列表中的列不明确” - 那么你需要使用:`ON DUPLICATE KEY UPDATE daily_events.last_event_id = IF(daily_events.last_event_created_at &lt; VALUES(last_event_created_at), VALUES(last_event_id), daily_events.last_event_id);` (2认同)

And*_*and 12

这是我们的最终解决方案,就像一个魅力!

插入忽略将确保在主机和从机都存在该行,万一他们曾经改行.

更新...其中,确保只有最新的更新,全球范围内,为最终结果的所有复制完成后.

mysql> desc test;
+-------+--------------+------+-----+-------------------+-------+
| Field | Type         | Null | Key | Default           | Extra |
+-------+--------------+------+-----+-------------------+-------+
| id    | int(11)      | NO   | PRI | NULL              |       | 
| value | varchar(255) | YES  |     | NULL              |       | 
| ts    | timestamp    | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+--------------+------+-----+-------------------+-------+

mysql> insert ignore into test values (4, "foo", now());    
mysql> update test set value = "foo", ts = now() where id = 4 and ts <= now();
Run Code Online (Sandbox Code Playgroud)