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真實的分歧的地方正文
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。