侧边栏壁纸
  • 累计撰写 6 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

MySql 不存在则插入,存在则更新或忽略

Aholic
2021-12-29 / 0 评论 / 0 点赞 / 592 阅读 / 1,213 字
温馨提示:
本文最后更新于 2021-12-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。

以下所有实例仅针对MySQL而言,并不能随意用于其它数据库

1. 不存在则插入,存在则更新

  • on duplicate key update

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句,例:

INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19)
ON DUPLICATE KEY UPDATE `age`=19; 

INSERT INTO sys_user (
    username,
    nickname,
    password,
    age,
    sex,
    job
    ) VALUES ('zhangsan','三德子','123','23','男','程序员1'),
    ('lisi','三德子','1234','24','男','程序员2'),
    ('wangwu','三德子','12345','25','男','程序员3')
    ON DUPLICATE KEY UPDATE
    nickname=values(nickname),
    password=values(password),
    age=values(age),
    sex=values(sex),
    job=values(job);

数据库中如果存在的数据返回的行数是2,如果不存在此条数据,则如果成功的行数为1

replace into

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据,例:

REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);

数据库中如果存在的数据返回的行数是2,因为它是先删除旧数据,然后再插入数据,如果不存在此条数据,则如果成功的行数为1

总结

  • ON DUPLICATE KEY UPDATE跟replace into比,语法复杂点点
  • ON DUPLICATE KEY UPDATE执行后主键本身不会变化,不破坏索引,性能比replace into 要高
  • replace into会让主键变化,所以业务强依赖索引的就不建议用此方法
  • replace into底层是先删除后插入数据,但需要重新维护索引
  • 必须要有主键或唯一索引才能有效,否则replace into就只新增了

缺点

  • 高并发场景,注意死锁
  • 主键会变化,注意是否影响你的业务

2. 无则添加,有​​则跳过(避免重复插入)

ignore

关键字/句:insert ignore into,如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据,例:

INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);

0
博主关闭了所有页面的评论