MySQL的Replace into 与 Insert into on duplicate key update的不同之处

相同点:

(1)没有key的时候,replace与insert .. on deplicate udpate相同。
(2)有key的时候,都保留主键值,并且auto_increment自动+1。

不同点:

 有key的时候,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如例子中c字段的值会被自动填充为默认值。
 
  而insert .. deplicate update则只执行update标记之后的sql,从表象上来看相当于一个简单的update语句。
 但是实际上,根据我推测,如果是简单的update语句,auto_increment不会+1,应该也是先delete,再insert的操作,只是在insert的过程中保留除update后面字段以外的所有字段的值。

 所以两者的区别只有一个,insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。
 
 从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。

myBatis xml 文件例子

1.Replace into
<!-- 批量增加和修改 -->
<insert id=“a" useGeneratedKeys="true">  
    REPLACE INTO table_name  
    (product_id,departs_date,price_value)  
    VALUES  
    <foreach collection="list" index="index" item="item"  
        separator=",">  
        (#{item.productId},#{item.departsDate},#{item.priceValue})  
    </foreach>  
</insert> 
2. Insert into on duplicate key update
    <!-- 批量增加和修改 -->
  <insert id="SaveOrUpdate" parameterType="java.util.List">
      insert into CART_PRO_SPEC(
            CART_PRO_ID,    
            PRO_SPEC2_ID,   
            NUM,    
            CART_PRO_SPEC_ID
        ) values 
      <foreach collection="list" item="item" index="index" separator=",">
          (#{item.CART_PRO_ID},    
            #{item.PRO_SPEC2_ID},    
            #{item.NUM}, 
            #{item.CART_PRO_SPEC_ID}
           )
      </foreach>
      ON DUPLICATE KEY UPDATE
         CART_PRO_ID = VALUES(CART_PRO_ID), 
         PRO_SPEC2_ID = VALUES(PRO_SPEC2_ID), 
         NUM = VALUES(NUM)
  </insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值