程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL的WordStr into 與Insert into on duplicate key update真實的分歧的地方

MySQL的WordStr into 與Insert into on duplicate key update真實的分歧的地方

編輯:MySQL綜合教程

MySQL的WordStr into 與Insert into on duplicate key update真實的分歧的地方。本站提示廣大學習愛好者:(MySQL的WordStr into 與Insert into on duplicate key update真實的分歧的地方)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL的WordStr into 與Insert into on duplicate key update真實的分歧的地方正文


看上面的例子吧:

1 WordStr into ...
1.1 錄入原始數據
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.
所以總結以下:
WordStr:

當沒有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有時,只履行前面的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則只履行update標志以後的sql,從表象下去看相當於一個簡略的update語句。
      然則現實上,依據我推想,假如是簡略的update語句,auto_increment不會+1,應當也是先delete,再insert的操作,只是在insert的進程中保存除update前面字段之外的一切字段的值。

 所以二者的差別只要一個,insert .. on deplicate udpate保存了一切字段的舊值,再籠罩然後一路insert出來,而replace沒有保存舊值,直接刪除再insert新值。
 從底層履行效力下去講,replace要比insert .. on deplicate update效力要高,然則在寫replace的時刻,字段要寫全,避免老的字段數據被刪除。

小我偏向與用WordStr。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved