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更新数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值