zoukankan      html  css  js  c++  java
  • mysql实现“存在即更新,不存在即插入”

    方法1:使用replace关键字

    replace是insert的增强版,可以实现插入的数据和已存在的数据发生主键或者唯一键重复,则删除已存在的数据,再实现插入,如果不重复,则直接插入数据。

    结合Mybatis批量处理,用法如下:

    <update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
    <!-- 存在则更新,不存在则插入 -->
    replace into
    schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
    values
    <foreach collection="list" item="schoolDataForm" separator=",">
    (
    #{schoolDataForm.Id},
    #{schoolDataForm.describeDataForm},
    #{schoolDataForm.childrenID},
    #{schoolDataForm.relevanceID},
    #{schoolDataForm.showType}
    )
    </foreach>
    </update>
    方法2:使用ON DUPLICATE KEY UPDATE

    该方法能够在主键或者唯一键重复时,修改原记录中某字段的数据。

    结合Mybatis批量处理,用法如下:

    <update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
    insert into
    schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
    values
    <foreach collection="list" item="schoolDataForm" separator=",">
    (
    #{schoolDataForm.Id},
    #{schoolDataForm.describeDataForm},
    #{schoolDataForm.childrenID},
    #{schoolDataForm.relevanceID},
    #{schoolDataForm.showType}
    )
    </foreach>

    <!--存在即可修改下述字段的数据,注意values()中的内容是数据表中相应的字段名-->
    ON DUPLICATE KEY UPDATE
    describeDataForm=values(describeDataForm),
    childrenID=values(childrenID),
    relevanceID=values(relevanceID),
    showType=values(showType)
    </update>
    性能区别:

    正如replace底层实现所示,如果主键重复会先删除数据库中原来的记录,插入新纪录。但是数据库删除操作需要维护主键索引,这无疑需要消耗性能。

    ON DUPLICATE KET QPDATE只是在主键重复时修改所需字段的值,所以不影响主键。维护成本自然相对于replace低。

    注意:在数据量较小时,两者效率大致相同,都很快,但是出现大量数据(百万级别)时,差异就显示出来了。

     
    ---------------------

  • 相关阅读:
    向代码致敬,寻找你的第83行
    佛系程序员的月薪五万指南
    再谈全局网HBase八大应用场景
    如何避免HBase写入过快引起的各种问题
    阿里云MaxCompute被Forrester评为全球云端数据仓库领导者
    为了让开发者写MaxCompute SQL更爽,DataWorks 增强SQL 编辑器功能
    《CDN 之我见》原理篇——CDN的由来与调度
    Installing GCC (C++ Compiler and Development Tools)
    Gems installation
    Fedora23
  • 原文地址:https://www.cnblogs.com/ly570/p/11235470.html
Copyright © 2011-2022 走看看