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 的加強版,既可以更新數據也可以插入數據;

它的執行邏輯是:首先判斷是否存在相同的唯一主鍵或者唯一索引,如果存在,則更新數據,否則,插入數據。例如:

[SQL]REPLACE INTO t1(a,b,c) VALUES(2,'22','22') ;
受影響的行: 2
時間: 0.048s

之所以會是2行數據受到影響,是因為表中已存在主鍵為2的數據,mysql先將原有的數據刪除,並將新的數據插入,因此受影響的是2行數據。

再看下面的例子:

[SQL]REPLACE INTO t1(a) VALUES(3) ;
受影響的行: 2
時間: 0.039s

可以看出,確實是先刪除后插入,當主鍵存在時,replace覆蓋相關字段,其它字段填充默認值,可以理解為刪除重復key的記錄,新插入一條記錄,一個delete原有記錄再insert的操作

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 ;如果不存在相同的主鍵或唯一索引,則直接插入。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM