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

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

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

  • 相关阅读:
    证明 O(n/1+n/2+…+n/n)=O(nlogn)
    ZOJ 3623 Battle Ships DP
    ZOJ 3631 Watashi's BG DFS
    ZOJ 3622 Magic Number 打表找规律
    poj 1088 滑雪 记忆化搜索
    poj 1273 Drainage Ditches 网络流最大流基础
    Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力
    UVALive 5059 C
    Codeforces Round #295 (Div. 2)C
    Codeforces Round #295 (Div. 2)B
  • 原文地址:https://www.cnblogs.com/ly570/p/11235470.html
Copyright © 2011-2022 走看看