• mysql 中 insert on duplicate key update 的用法


    处理很多大数据量插入重复数据有唯一键时使用,这种用法只能用于mysql中,其他数据库不适用

    1、在xml文件中常用写法:

         <update id="UPDATE_HOTEL_COUNTY_DISTRICT" parameterType="java.lang.String">
            INSERT INTO VST_SEARCH_PROD_HOTEL(PRODUCT_ID,COUNTY_DISTRICT_ID,COUNTY_DISTRICT_NAME)
            (
            SELECT
                t1.PRODUCT_ID,
                t2.DISTRICT_ID COUNTY_DISTRICT_ID, 
                t2.DISTRICT_NAME COUNTY_DISTRICT_NAME
            FROM
                VST_SEARCH_PROD_HOTEL t1
            LEFT JOIN VST_SEARCH_DISTRICT_LEVEL t2 ON t1.DISTRICT_ID  = t2.DISTRICT_ID
            WHERE t2.DISTRICT_TYPE ='COUNTY'
            <if test="_parameter != null">
                    AND t1.PRODUCT_ID IN (${_parameter})
              </if>
            )
            ON DUPLICATE KEY UPDATE
            COUNTY_DISTRICT_ID = VALUES(COUNTY_DISTRICT_ID),
            COUNTY_DISTRICT_NAME = VALUES(COUNTY_DISTRICT_NAME)
         </update>

    2、在java代码中常用拼sql的方式实现:

        public synchronized static void insertBatch(List<RealTimePriceBean> list) {
            StringBuffer sql = new StringBuffer();
            StringBuffer subsql = new StringBuffer();
            sql.append("INSERT INTO VST_HOTEL_REAL_TIME_PRICE (")//
                    .append("PRODUCT_ID,")//
                    .append("REAL_TIME_PRICE1,")//
                    .append("REAL_TIME_PRICE2,")//
                    .append("REAL_TIME_REMAIN1,")//
                    .append("REAL_TIME_REMAIN2,")//
                    .append("SELL_OUT_FLAG1,")//
                    .append("SELL_OUT_FLAG2,")//
                    .append("UPDATE_TIME) VALUES");//
    
            for (RealTimePriceBean realTimePriceBean : list) {
                sql.append("(")//
                        .append(realTimePriceBean.getProductId()).append(",")//
                        .append(realTimePriceBean.getRealTimePrice1()).append(",")//
                        .append(realTimePriceBean.getRealTimePrice2()).append(",")//
                        .append(realTimePriceBean.getRealTimeRemain1()).append(",")//
                        .append(realTimePriceBean.getRealTimeRemain2()).append(",")//
                        .append(StringUtils.isBlank(realTimePriceBean.getSellOutFlag1()) ? null : "'" + realTimePriceBean.getSellOutFlag1() + "'").append(",")//
                        .append(StringUtils.isBlank(realTimePriceBean.getSellOutFlag2()) ? null : "'" + realTimePriceBean.getSellOutFlag2() + "'").append(",")//
                        .append("NOW()")//
                        .append("),");//
            }
            String newsql = sql.substring(0, sql.length() - 1);
            subsql.append(" ON DUPLICATE KEY UPDATE ")//
                    .append("REAL_TIME_PRICE1  =  VALUES(REAL_TIME_PRICE1),")//
                    .append("REAL_TIME_PRICE2  =  VALUES(REAL_TIME_PRICE2),")//
                    .append("REAL_TIME_REMAIN1 =  VALUES(REAL_TIME_REMAIN1),")//
                    .append("REAL_TIME_REMAIN2 =  VALUES(REAL_TIME_REMAIN2),")//
                    .append("SELL_OUT_FLAG1    =  VALUES(SELL_OUT_FLAG1),")//
                    .append("SELL_OUT_FLAG2    =  VALUES(SELL_OUT_FLAG2),")//
                    .append("UPDATE_TIME       =  VALUES(UPDATE_TIME)");//
            executeBatch(newsql + subsql);
        }

    3、直接在客户端上使用时可以通过过:

    INSERT INTO appointment (book_id,student_id,appoint_time)
    VALUES (1, 8, NOW()) ON DUPLICATE KEY 
    UPDATE student_id=8;

    4、有些情况可以忽略主键,如果存在则不插入:

    INSERT IGNORE INTO appointment (book_id,student_id,appoint_time) VALUES (1000, 8, NOW()) 

     注:生产中发现使用 updae 更新数据2000/s 使用 insert into  ... duplicate key 更新速度为40000/s ,差别非常明显,推荐使用 insert into ... duplicate key更新数据

  • 相关阅读:
    c# 创建多线程
    使用opencvsharp通过mvvm在image中显示图片
    c# 创建文件/文件夹对话框
    wpf MVVM框架基础
    wpf DataBinding
    layui自动点击下拉列表的一项并选中
    LayUI默认样式调整
    mysql取某个组的前n条数据
    Kali3.0系统切换中文
    JS触发某元素周围元素的样式改变
  • 原文地址:https://www.cnblogs.com/zhanh247/p/11696421.html
Copyright © 2020-2023  润新知