zoukankan      html  css  js  c++  java
  • MySQL的insert ignore与replace into不同

    以前从来没有接触过replace into这个语法,但是却看到很多人都在使用这个语法,并且应用在很多生产环境中,于是我也去学习了一下repalce into的用法。

    关于replace

    一句话:正常情况下表中有PRIMARY KEYUNIQUE索引,新数据会替换老的数据。没有老数据则insert该数据。

    REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。使用REPLACE相当于对原有的数据(在PRIMARY KEY或UNIQUE索引下有值的数据)进行delete操作,然后再insert操作。为了能够使用REPLACE,您必须同时拥有表的INSERTDELETE权限。

    除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

    replace的使用一般是:只想对数据在数据库中保存一份,不想出现重复的数据(重复的主键、唯一索引),因为重复的数据不是我们想要的,会给业务逻辑带来麻烦。但是又要更新一些字段为最新的值,比如最后的检查时间、任务的结果。

      REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和
    受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

    关于insert ignore

    一句话:忽略执行insert语句出现的错误,不会忽略语法问题,但是忽略主键存在的情况。

    如果没有ignore关键字,那么在insert数据到一个表(在UNIQUE索引PRIMARY KEY有相同值)中,这时会出现错误,语句执行失败。但是使用了ignore关键字后,不会出现这个错误,并且新数据不会被插入到数据表中。

    使用场景:比如一个多线程的插入数据表,为了不让多个线程向表中插入相同的数据,可以使用insert ignore来忽略重复的数据。有比如,你的程序down了,需要重新运行,那么会重新拉取数据再insert到数据库中,这个时候可能会存在重复的数据导致错误,ignore就可以解决这个问题。

    两者的一些联系区别

    联系:

    不想向数据表中插入相同的主键、unique索引时,可以使用replaceinsert ignore,来避免重复的数据。

    区别:

    • replace相当于delete然后insert,会有对数据进行写的过程。
    • insert ignore会忽略已经存在主键或unique索引的数据,而不会有数据的修改。

    使用场景:

    • 如果不需要对数据进行更新值,那么推荐使用insert ignore,比如:多线程的插入相同的数据。
    • 如果需要对数据进行更新最新的值,那么使用replace,比如:任务的结果,最后的更新时间。

    后话:自从知道了有insert ignore,我再也不会一股劲的使用replace了,妈妈再也不用担心数据库的频繁删写操作。

    参考资料

  • 相关阅读:
    重学Docker
    rabbitmq基本知识了解
    rabbitmq之mq协议了解
    微信公众平台开发教程(三) 基础框架搭建
    微信公众平台开发教程(二) 基本原理及消息接口
    微信公众平台开发教程(一) 微信公众账号注册流程
    微信公众平台开发教程(十) 订阅号与服务号的区别
    vue cli3.0快速搭建项目详解(强烈推荐)
    vue 3.0 初体验 (项目搭建)
    手把手教你vue3.0项目搭建
  • 原文地址:https://www.cnblogs.com/conanwang/p/5888274.html
Copyright © 2011-2022 走看看