mysql中的replace into和 on duplicate key update
来源:互联网 发布:淘宝的飞车倒点辅助 编辑:程序博客网 时间:2024/04/27 03:18
mysql中有replace into 和 on duplicate key update 实现类似oracle merge into的功能,经过实现测试on duplicate key update的性能更高,另外replace into的实现操作是先删除再插入,所以会造成其他列的数据丢失。所以实际使用中,不建议使用replace into,而是on duplicate key update.
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:16:29 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
mysql> replace into t1(id,name) values(3,'qing');
Query OK, 2 rows affected (0.03 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
由上可见不即使新修改的值是一样,还是实现做了update操作。
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
mysql> insert into t1 (id,name) values(3,'qing') on duplicate key update id=values(id),name=values(name);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
从以上看出值相同时,数据库里的时间列并没有发生修改。
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
| 7 | qing | 2015-08-24 10:25:58 |
| 9 | qing | 2015-08-24 10:27:17 |
+----+-------+---------------------+
5 rows in set (0.00 sec)
mysql> insert into t1 (id,name) values(3,'qing1') on duplicate key update id=values(id),name=values(name);
Query OK, 2 rows affected (0.01 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing1 | 2015-08-24 10:28:44 |
| 5 | qing | 2015-08-24 10:18:31 |
| 7 | qing | 2015-08-24 10:25:58 |
| 9 | qing | 2015-08-24 10:27:17 |
+----+-------+---------------------+
5 rows in set (0.00 sec)
时间只变化了有变化的列。
mysql> insert into t1 (id,name) values(11,'qing1'),(12,'ru') on duplicate key update id=values(id),name=values(name);
mysql> alter table t1 add column city varchar(30);
mysql> insert into t1(name,city) values('tan','bj');
mysql> insert into t1(name,city) values('tan1','bj1');
mysql> insert into t1(name,city) values('tan1','bj2');
mysql> insert into t1(name,city) values('tan1','bj3');
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:02:16 | bj1 |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> replace into t1(id,name) value(262115,'tan1');
Query OK, 2 rows affected (0.08 sec)
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> insert into t1(id,name)values(262117,'tan1')
-> on duplicate key update id=values(id),name=values(name);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> insert into t1(id,name)values(262117,'tan11') on duplicate key update id=values(id),name=values(name);
Query OK, 2 rows affected (0.00 sec)
mysql> select * from t1;
+--------+-------+---------------------+------+
| id | name | lastupdate | city |
+--------+-------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan11 | 2015-08-24 11:04:57 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+-------+---------------------+------+
4 rows in set (0.00 sec)
一。基本测试
create table t1 (
id int primary key auto_increment,
name varchar(30),
lastupdate timestamp not null default current_timestamp on update current_timestamp
);
1.测试replace into
mysql> select * from t1;+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:16:29 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
mysql> replace into t1(id,name) values(3,'qing');
Query OK, 2 rows affected (0.03 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
由上可见不即使新修改的值是一样,还是实现做了update操作。
2.测试on duplicate key update相同值的更新。
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
mysql> insert into t1 (id,name) values(3,'qing') on duplicate key update id=values(id),name=values(name);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
+----+-------+---------------------+
3 rows in set (0.00 sec)
从以上看出值相同时,数据库里的时间列并没有发生修改。
3.测试on duplicate key update不同值的更新。
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing | 2015-08-24 10:19:13 |
| 5 | qing | 2015-08-24 10:18:31 |
| 7 | qing | 2015-08-24 10:25:58 |
| 9 | qing | 2015-08-24 10:27:17 |
+----+-------+---------------------+
5 rows in set (0.00 sec)
mysql> insert into t1 (id,name) values(3,'qing1') on duplicate key update id=values(id),name=values(name);
Query OK, 2 rows affected (0.01 sec)
mysql> select * from t1;
+----+-------+---------------------+
| id | name | lastupdate |
+----+-------+---------------------+
| 1 | tanqr | 2015-08-24 09:59:28 |
| 3 | qing1 | 2015-08-24 10:28:44 |
| 5 | qing | 2015-08-24 10:18:31 |
| 7 | qing | 2015-08-24 10:25:58 |
| 9 | qing | 2015-08-24 10:27:17 |
+----+-------+---------------------+
5 rows in set (0.00 sec)
时间只变化了有变化的列。
4.on duplicate key update的更多用法 :
mysql> insert into t3 select * from t2 on duplicate key update id =values(id),name=values(name);mysql> insert into t1 (id,name) values(11,'qing1'),(12,'ru') on duplicate key update id=values(id),name=values(name);
二。replace into 和on duplicate key update是否会造成数据丢失的比较。
mysql> alter table t1 add column city varchar(30);
mysql> insert into t1(name,city) values('tan','bj');
mysql> insert into t1(name,city) values('tan1','bj1');
mysql> insert into t1(name,city) values('tan1','bj2');
mysql> insert into t1(name,city) values('tan1','bj3');
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:02:16 | bj1 |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> replace into t1(id,name) value(262115,'tan1');
Query OK, 2 rows affected (0.08 sec)
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> insert into t1(id,name)values(262117,'tan1')
-> on duplicate key update id=values(id),name=values(name);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+--------+------+---------------------+------+
| id | name | lastupdate | city |
+--------+------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan1 | 2015-08-24 11:02:19 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+------+---------------------+------+
4 rows in set (0.00 sec)
mysql> insert into t1(id,name)values(262117,'tan11') on duplicate key update id=values(id),name=values(name);
Query OK, 2 rows affected (0.00 sec)
mysql> select * from t1;
+--------+-------+---------------------+------+
| id | name | lastupdate | city |
+--------+-------+---------------------+------+
| 262113 | tan | 2015-08-24 11:01:36 | bj |
| 262115 | tan1 | 2015-08-24 11:03:29 | NULL |
| 262117 | tan11 | 2015-08-24 11:04:57 | bj2 |
| 262119 | tan1 | 2015-08-24 11:02:21 | bj3 |
+--------+-------+---------------------+------+
4 rows in set (0.00 sec)
0 0
- mysql中的replace into和 on duplicate key update
- mysql中ON DUPLICATE KEY UPDATE和REPLACE INTO用法
- REPLACE INTO 和 INSERT INTO ... ON DUPLICATE KEY UPDATE SET ...
- replace into 和 insert into *** on duplicate key update
- Mysql中Insert into xxx on duplicate key update和REPLACE INTO使用
- Mysql中Insert into xxx on duplicate key update和REPLACE INTO使用
- Mysql replace into 与 insert into on duplicate key update 死锁和性能测试
- mysql中insert into on duplicate key update 和replace into的区别
- mysql replace into和 insert into ... on duplicate update 区别
- MYSQL之REPLACE INTO和INSERT … ON DUPLICATE KEY UPDATE用法
- insert into replace into 和insert into .. on duplicate key update ..
- INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO 和 INSERT IGNORE INTO
- Mysql replace into 与 insert into on duplicate key update 的区别
- MySQL的Replace into 与Insert into ..... on duplicate key update ...真正的不同之处
- MySQL的Replace into 与Insert into ..... on duplicate key update ...真正的不同之处
- MySQL的Replace into 与Insert into ..... on duplicate key update
- MySQL的Replace into 与Insert into ..... on duplicate key update ...真正的不同之处
- MySQL的Replace into 与Insert into ..... on duplicate key update ...真正的不同之处
- 链表分割
- spark源码阅读环境搭建
- Android View 属性详解
- C++ Primer 5e chapter 15.1
- hessian简介
- mysql中的replace into和 on duplicate key update
- Java知识总结---整合SpringMVC+Mybatis+Spring(二)
- A1073. Scientific Notation (20)
- JAVA基础7(代码剖析)
- STM32窗口看门狗
- LINUX笔记6
- Rhel 7 nfs install
- oracle 估算undo脚本
- POJ 1469 && ZOJ 1140 --COURSES【二分图 && 最大匹配】