MySQL的Replace into与Insert into ... on duplicate key update

REPLACE​:

REPLACE INTO `table_name`(`col_name`, ...) VALUES (...);
REPLACE INTO `table_name` (`col_name`, ...) SELECT ...;
REPLACE INTO `table_name` SET `col_name`='value',

ON DUPLICATE KEY UPDATE:

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) 
ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

相同之处:
(1)没有key的时候,replace与insert .. on deplicate udpate相同
(2)有key的时候,都保留主键值,并且auto_increment自动+1

不同之初:

insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值