MySQL的Replace into 与Insert into on duplicate key update真实的不同之处ITeye - 凯发娱乐

MySQL的Replace into 与Insert into on duplicate key update真实的不同之处ITeye

2019-01-11 02:22:04 | 作者: 浩初 | 标签: 记载,时分,操作 | 浏览: 2642

1 Replace 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.
所以总结如下:
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有时,只履行后边的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的时分,字段要写全,避免老的字段数据被删去。

个人倾向与用Replace。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章