最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的Replace into 與Insert into on duplicate key update真正的不同之處

 更新時間:2014年02月20日 17:30:21   作者:  
今天聽同事介紹oracle到mysql的數(shù)據(jù)migration,他用了Insert into ..... on duplicate key update ...,我當時就想怎么不用Replace呢,于是回來就仔細查了下,它們果然還是有區(qū)別的
看下面的例子吧:

1 Replace into ...
1.1 錄入原始數(shù)據(jù)

mysql> use test;
Database changed
mysql>

mysql> CREATE TABLE t1 SELECT 1 AS a, 'c3' AS b, 'c2' AS c;
ALTER TABLE t1 CHANGE a a INT PRIMARY KEY AUTO_INCREMENT ;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

 

mysql> INSERT INTO t1 SELECT 2,'2', '3';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> insert into t1(b,c) select 'r2','r3';
Query OK, 1 row affected (0.08 sec)
Records: 1  Duplicates: 0  Warnings: 0

 

1.2 開始replace操作
mysql> REPLACE INTO t1(a,b) VALUES(2,'a') ;
Query OK, 2 rows affected (0.06 sec)

【】看到這里,replace,看到這里,a=2的記錄中c字段是空串了,
所以當與key沖突時,replace覆蓋相關字段,其它字段填充默認值,可以理解為刪除重復key的記錄,新插入一條記錄,一個delete原有記錄再insert的操作

1.3 但是不知道對主鍵的auto_increment有無影響,接下來測試一下:

mysql> insert into t1(b,c) select 'r4','r5'; 
Query OK, 1 row affected (0.05 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r2 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec)

 

【】從這里可以看出,新的自增不是從4開始,而是從5開始,就表示一個repalce操作,主鍵中的auto_increment會累加1.
所以總結如下:
Replace:

當沒有key時,replace相當于普通的insert.
當有key時,可以理解為刪除重復key的記錄,在保持key不變的情況下,delete原有記錄,再insert新的記錄,新紀錄的值只會錄入replace語句中字段的值,其余沒有在replace語句中的字段,會自動填充默認值。

2.1 ok,再來看Insert into ..... on duplicate key update,

mysql> insert into t1(a,b) select '3','r5' on duplicate key update b='r5'; 
Query OK, 2 rows affected, 1 warning (0.19 sec) 
Records: 1 Duplicates: 1 Warnings: 1 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec)

【】a=5時候,原來的c值還在,這表示當key有時,只執(zhí)行后面的udate操作語句.

2.2 再檢查auto_increment情況。

mysql> insert into t1(a,b) select '3','r5' on duplicate key update b='r5'; 
Query OK, 2 rows affected, 1 warning (0.19 sec) 
Records: 1 Duplicates: 1 Warnings: 1 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec) 

mysql> insert into t1(b,c) select 'r6','r7'; 
Query OK, 1 row affected (0.19 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
| 7 | r6 | r7 | 
+---+----+----+ 
5 rows in set (0.00 sec) 

【】從這里可以看出,新的自增不是從6開始,而是從7開始,就表示一個Insert .. on deplicate udate操作,主鍵中的auto_increment也跟replace一樣累加1.

2.3 再看下當沒有key的時候,insert .. on deplicate update的情況

mysql> insert into t1(a,b,c) select '33','r5','c3' on duplicate key update b='r5'; 
Query OK, 1 row affected, 1 warning (0.23 sec) 
Records: 1 Duplicates: 0 Warnings: 1 

mysql> select * from t1; 
+----+----+----+ 
| a | b | c | 
+----+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | b5 | r3 | 
| 5 | r4 | r5 | 
| 7 | r6 | r7 | 
| 9 | s6 | s7 | 
| 33 | r5 | c3 | 
+----+----+----+ 
7 rows in set (0.00 sec)

看a=33的記錄,ok,全部錄入了。

3 總結從上面的測試結果看出,相同之處:
(1),沒有key的時候,replace與insert .. on deplicate udpate相同。
(2),有key的時候,都保留主鍵值,并且auto_increment自動+1
不同之處:有key的時候,replace是delete老記錄,而錄入新的記錄,所以原有的所有記錄會被清除,這個時候,如果replace語句的字段不全的話,有些原有的比如例子中c字段的值會被自動填充為默認值。
      而insert .. deplicate update則只執(zhí)行update標記之后的sql,從表象上來看相當于一個簡單的update語句。
      但是實際上,根據(jù)我推測,如果是簡單的update語句,auto_increment不會+1,應該也是先delete,再insert的操作,只是在insert的過程中保留除update后面字段以外的所有字段的值。

 所以兩者的區(qū)別只有一個,insert .. on deplicate udpate保留了所有字段的舊值,再覆蓋然后一起insert進去,而replace沒有保留舊值,直接刪除再insert新值。
 從底層執(zhí)行效率上來講,replace要比insert .. on deplicate update效率要高,但是在寫replace的時候,字段要寫全,防止老的字段數(shù)據(jù)被刪除。

個人傾向與用Replace。

相關文章

  • Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式

    Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式

    這篇文章主要介紹了Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL Hints控制查詢優(yōu)化器的選擇問題小結

    MySQL Hints控制查詢優(yōu)化器的選擇問題小結

    MySQL Hints是一種強大的工具,可以幫助我們解決復雜的查詢性能問題,然而,它們應該謹慎使用,并且總是與徹底的測試和驗證相結合,本文介紹MySQL Hints控制查詢優(yōu)化器的選擇,感興趣的朋友一起看看吧
    2024-06-06
  • MySQL使用UNIQUE實現(xiàn)數(shù)據(jù)不重復插入

    MySQL使用UNIQUE實現(xiàn)數(shù)據(jù)不重復插入

    當unique列在一個UNIQUE鍵上插入包含重復值的記錄時,我們可以控制MySQL如何處理這種情況:使用IGNORE關鍵字或者ON DUPLICATE KEY UPDATE子句跳過INSERT、中斷操作或者更新舊記錄為新值。
    2017-05-05
  • MySQL通過show status查看、explain分析優(yōu)化數(shù)據(jù)庫性能

    MySQL通過show status查看、explain分析優(yōu)化數(shù)據(jù)庫性能

    這篇文章介紹了MySQL通過show status查看、explain分析優(yōu)化數(shù)據(jù)庫性能的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 從MySQL的源碼剖析Innodb buffer的命中率計算

    從MySQL的源碼剖析Innodb buffer的命中率計算

    這篇文章主要介紹了從MySQL的源碼剖析Innodb buffer的命中率計算,作者結合C語言寫的算法來分析innodb buffer hit Ratios,需要的朋友可以參考下
    2015-05-05
  • MySQL查詢語句大全集錦

    MySQL查詢語句大全集錦

    這篇文章主要介紹了MySQL查詢語句大全集錦,需要的朋友可以參考下
    2016-06-06
  • MySQL不支持InnoDB的解決方法

    MySQL不支持InnoDB的解決方法

    在OpenSUSE下裝上MySQL后,發(fā)現(xiàn)無法選擇添加事務支持數(shù)據(jù)引擎InnoDB。
    2009-11-11
  • MySQL分區(qū)表的局限和限制詳解

    MySQL分區(qū)表的局限和限制詳解

    本文對Mysql分區(qū)表的局限性做了一些總結,因為個人能力以及測試環(huán)境的 原因,有可能有錯誤的地方,還請大家看到能及時指出,當然有興趣的朋友可以去官方網站查閱。
    2017-03-03
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 找回MySQL管理員root密碼的3個妙招

    找回MySQL管理員root密碼的3個妙招

    最近筆者的一臺mysql服務器忘記了超級管理員root密碼,而mysql修改密碼必須得知道舊密碼的情況下才能進行,真的很郁悶,找了很多方法都無?效,最終找到了解決方法,下面把mysql?root密碼找回妙招分享給大家,感興趣的朋友一起看看吧
    2022-11-11

最新評論

潞西市| 册亨县| 阳东县| 安康市| 大石桥市| 恩平市| 永州市| 嘉义市| 应用必备| 南江县| 文成县| 平远县| 三明市| 岳阳市| 若尔盖县| 大宁县| 永清县| 甘南县| 庆元县| 安溪县| 通化县| 晋中市| 西城区| 芒康县| 天津市| 鲁甸县| 忻州市| 南澳县| 灯塔市| 禄丰县| 无为县| 浪卡子县| 陕西省| 石林| 常山县| 汉寿县| 三都| 大庆市| 茌平县| 封丘县| 西乌珠穆沁旗|