欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年02月20日 17:30:21   作者:  
今天聽(tīng)同事介紹oracle到mysql的數(shù)據(jù)migration,他用了Insert into ..... on duplicate key update ...,我當(dāng)時(shí)就想怎么不用Replace呢,于是回來(lái)就仔細(xì)查了下,它們果然還是有區(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 開(kāi)始replace操作
mysql> REPLACE INTO t1(a,b) VALUES(2,'a') ;
Query OK, 2 rows affected (0.06 sec)

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

1.3 但是不知道對(duì)主鍵的auto_increment有無(wú)影響,接下來(lái)測(cè)試一下:

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開(kāi)始,而是從5開(kāi)始,就表示一個(gè)repalce操作,主鍵中的auto_increment會(huì)累加1.
所以總結(jié)如下:
Replace:

當(dāng)沒(méi)有key時(shí),replace相當(dāng)于普通的insert.
當(dāng)有key時(shí),可以理解為刪除重復(fù)key的記錄,在保持key不變的情況下,delete原有記錄,再insert新的記錄,新紀(jì)錄的值只會(huì)錄入replace語(yǔ)句中字段的值,其余沒(méi)有在replace語(yǔ)句中的字段,會(huì)自動(dòng)填充默認(rèn)值。

2.1 ok,再來(lái)看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時(shí)候,原來(lái)的c值還在,這表示當(dāng)key有時(shí),只執(zhí)行后面的udate操作語(yǔ)句.

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開(kāi)始,而是從7開(kāi)始,就表示一個(gè)Insert .. on deplicate udate操作,主鍵中的auto_increment也跟replace一樣累加1.

2.3 再看下當(dāng)沒(méi)有key的時(shí)候,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 總結(jié)從上面的測(cè)試結(jié)果看出,相同之處:
(1),沒(méi)有key的時(shí)候,replace與insert .. on deplicate udpate相同。
(2),有key的時(shí)候,都保留主鍵值,并且auto_increment自動(dòng)+1
不同之處:有key的時(shí)候,replace是delete老記錄,而錄入新的記錄,所以原有的所有記錄會(huì)被清除,這個(gè)時(shí)候,如果replace語(yǔ)句的字段不全的話,有些原有的比如例子中c字段的值會(huì)被自動(dòng)填充為默認(rèn)值。
      而insert .. deplicate update則只執(zhí)行update標(biāo)記之后的sql,從表象上來(lái)看相當(dāng)于一個(gè)簡(jiǎn)單的update語(yǔ)句。
      但是實(shí)際上,根據(jù)我推測(cè),如果是簡(jiǎn)單的update語(yǔ)句,auto_increment不會(huì)+1,應(yīng)該也是先delete,再insert的操作,只是在insert的過(guò)程中保留除update后面字段以外的所有字段的值。

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

個(gè)人傾向與用Replace。

相關(guān)文章

  • mybatis中的三種批量插入方式對(duì)比

    mybatis中的三種批量插入方式對(duì)比

    這篇文章主要介紹了mybatis中的三種批量插入方式對(duì)比,Mybatis是一款流行的Java持久化框架,它提供了三種不同的批量插入方式,分別為普通循環(huán)插入、BatchExecutor和JDBC批處理,普通循環(huán)插入方式適用于數(shù)據(jù)量較小的情況,但隨著數(shù)據(jù)量的增大會(huì)影響性能,需要的朋友可以參考下
    2023-10-10
  • MySQL 鎖的相關(guān)知識(shí)總結(jié)

    MySQL 鎖的相關(guān)知識(shí)總結(jié)

    這篇文章主要介紹了MySQL 鎖的相關(guān)知識(shí)總結(jié),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01
  • MySQL 導(dǎo)出數(shù)據(jù)為csv格式的方法

    MySQL 導(dǎo)出數(shù)據(jù)為csv格式的方法

    這篇文章主要介紹了MySQL 導(dǎo)出數(shù)據(jù)為csv格式的方法,需要的朋友可以參考下
    2015-10-10
  • navicat連接mysql時(shí)出現(xiàn)1045錯(cuò)誤的解決方法

    navicat連接mysql時(shí)出現(xiàn)1045錯(cuò)誤的解決方法

    這篇文章主要為大家詳細(xì)介紹了navicat連接mysql時(shí)出現(xiàn)1045錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Linux系統(tǒng)下實(shí)現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法教程

    Linux系統(tǒng)下實(shí)現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法教程

    MySQL默認(rèn)root用戶只能本地訪問(wèn),不能遠(yuǎn)程連接管理mysql數(shù)據(jù)庫(kù),Linux如何開(kāi)啟mysql遠(yuǎn)程連接?下面這篇文章主要給大家介紹了在Linux系統(tǒng)下實(shí)現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法教程,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • MySQL 如何使用事務(wù)

    MySQL 如何使用事務(wù)

    這篇文章主要介紹了MySQL 如何使用事務(wù),幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-09-09
  • mysql SELECT FOR UPDATE語(yǔ)句使用示例

    mysql SELECT FOR UPDATE語(yǔ)句使用示例

    本文介紹在mysql中使用mysql SELECT FOR UPDATE 語(yǔ)句時(shí)的一些問(wèn)題與解決辦法
    2013-11-11
  • 簡(jiǎn)單談?wù)凪ySQL的半同步復(fù)制

    簡(jiǎn)單談?wù)凪ySQL的半同步復(fù)制

    從MySQL5.5開(kāi)始,MySQL以插件的形式支持半同步復(fù)制。如何理解半同步呢?今天我們就來(lái)詳細(xì)講解下,希望大家能夠喜歡。
    2017-03-03
  • MySQL 5.5.x my.cnf參數(shù)配置優(yōu)化詳解

    MySQL 5.5.x my.cnf參數(shù)配置優(yōu)化詳解

    今天正好看到一篇有關(guān)my.cnf優(yōu)化的總結(jié),雖然還沒(méi)經(jīng)過(guò)我自己的實(shí)踐檢驗(yàn),但從文章內(nèi)容來(lái)說(shuō)已經(jīng)寫的很詳細(xì)了(當(dāng)然,事實(shí)上下面這篇文章很多地方只是翻譯了my.cnf原始配置文件的說(shuō)明,呵呵),所以特地轉(zhuǎn)載收藏一下
    2015-08-08
  • MySQL實(shí)現(xiàn)雪花Id函數(shù)

    MySQL實(shí)現(xiàn)雪花Id函數(shù)

    相比UUID無(wú)序生成的id而言,雪花算法是有序的,而且都是由數(shù)字組成,本文主要介紹了MySQL實(shí)現(xiàn)雪花Id函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11

最新評(píng)論