zoukankan      html  css  js  c++  java
  • MySQL中Replace into语句与Insert into on duplicate key update语句对比

    1.初始化表和测试数据

    CREATE TABLE t1 SELECT 1 AS a, 'c3' AS b, 'c2' AS c;
    ALTER TABLE t1 CHANGE a a INT PRIMARY KEY AUTO_INCREMENT ;
    INSERT INTO t1 SELECT 2,'2', '3';
    insert into t1(b,c) select 'r2','r3';
    

     2.replace语句测试

    replace into是insert into 的加强版,既可以更新数据也可以插入数据;

    它的执行逻辑是:首先判断是否存在相同的唯一主键或者唯一索引,如果存在,则更新数据,否则,插入数据。例如:

    REPLACE INTO t1(a,b) VALUES(2,'a') ;
    [SQL]REPLACE INTO t1(a,b) VALUES(2,'a') ;
    受影响的行: 2
    时间: 0.048s
    

    之所以会是2行数据受到影响,是因为表中已存在主键为1的数据,mysql先将原有的数据删除,并将新的数据插入,因此受影响的是2行数据。

    再看下面的例子:

    REPLACE INTO t1(a,b,c) VALUES(3,'','');
    [SQL]REPLACE INTO t1(a,b,c) VALUES(3,'','') ;
    受影响的行: 2
    时间: 0.039s
    

    可以看出,确实是先删除后插入

    insert into  on duplicate key udpate 和replace into 类似,也是可以插入和更新,它们的不同点是,insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。

    关于insert on update的详细用法和说明可以看我其他两篇文章:

    Mysql死锁排查:insert on duplicate死锁一次排查分析过程

    Mybatis大量数据的插入或更新操作方案思考(使用ON DUPLICATE KEY UPDATE)

    3.总结

    如果存在相同的主键或唯一索引,replace into 相当于先删除数据而后在插入,如果不存在相同的主键和唯一索引,则直接插入。

    如果存在相同的主键或唯一索引,insert into  on duplicate key update只更新update后面的字段,相当于udpate ;如果不存在相同的主键或唯一索引,则直接插入。

     

  • 相关阅读:
    angularjs select
    DataInputStream和DataOutputStream
    Linux gcc编译器
    Linux 网络配置
    Linux 实用工具vi
    Linux 文件系统
    Linux Linux系统管理命令
    Linux Linux常用命令二
    Linux Linux常用命令一
    数据结构 排序(归并排序)
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/13087343.html
Copyright © 2011-2022 走看看