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低。

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

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

  • 相关阅读:
    我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库
    有两个数据库A和B,数据库A中有表a,如何把表a映射到数据库B中,sql 2005
    代码生成器
    IWorkSpace接口介绍
    空间数据库介绍
    IGeoFeatureLayer
    IFeatureLayer
    Python ML环境搭建与学习资料推荐
    Python ML环境搭建与学习资料推荐
    TypeError: Can not convert a float32 into a Tensor or Operation.
  • 原文地址:https://www.cnblogs.com/ly570/p/11235470.html
Copyright © 2011-2022 走看看