不存在即插入,存在即更新 -INSERT ... ON DUPLICATE KEY UPDATE

114 阅读1分钟

研发场景:

那现在有一张table表,其中主键primary key 是 string :user_id和date:data_time 两个字段,还有其他字段。我需要往这张表写中间数据,如何做到 saveOrUpdate操作呢? 即不存在即插入,存在即更新呢?

传统解决办法是,先查出来已有记录,判断对应记录是否存在,再进行新增或更新操作。数据量较小的时候,这种方案可行,比如后台的基础功能。但是如果数据量过大时,每个都查出来进行处理,实际上性能上有一定损耗,而且代码层面实现也很不方便,容易超时。我就不想先查出来,假设几百万条数据 查个dei啊。如何一步到位呢?一条SQL能不能直接搞定呢?答案是 能!

在该实际场景中,使用 INSERT ... ON DUPLICATE KEY UPDATE 语句是非常适合的。它可以在 MySQL 中实现不存在即插入,存在即更新的功能。假设你的表 table 的主键由 user_iddata_time 组成,下面是实现的方式。


示例 SQL 语句

INSERT INTO `table` (user_id, data_time, field1, field2, field3)
VALUES 
    ('userid_1', '2024-11-27 15:00:00', 10, 20, 30)
ON DUPLICATE KEY UPDATE 
    field1 = VALUES(field1),
    field2 = VALUES(field2),
    field3 = VALUES(field3);
  1. INSERT INTO 部分

    • 将要插入的数据列出。
  2. ON DUPLICATE KEY UPDATE 部分

    • 如果主键 (user_id, data_time) 已存在,则更新指定字段。
    • VALUES(fieldX) 表示用本次插入的值来更新字段。

说明: