zoukankan      html  css  js  c++  java
  • 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更新数据

  • 相关阅读:
    Java 判断回文字符串有多少和其中的最大字符串
    多线程下并发数据结构
    HashMap底层及使用个人理解
    简单预览课本后的疑问
    自我介绍
    HTML中行内元素与块级元素的区别:
    html基本选择符的使用
    Html简单介绍
    Sublime Text 3 快捷键精华版
    html文本的基本设置
  • 原文地址:https://www.cnblogs.com/zhanh247/p/11696421.html
Copyright © 2011-2022 走看看