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

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

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

  • 相关阅读:
    spider-抓取页面内容
    Zabbix监控
    时间戳转换
    计算机脱域
    查询指定时间内审核失败的事件日志
    spider-抓取网页内容(Beautiful soup)
    Queue
    spider-抓取网页内容
    MyEclipse+Tomcat配置
    Gradle Java Web应用程序并在Tomcat上运行
  • 原文地址:https://www.cnblogs.com/ly570/p/11235470.html
Copyright © 2020-2023  润新知