惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
B
Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
小众软件
小众软件
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
量子位

博客园 - killkill

jar 冲突、class 冲突的检测脚本 Oracle User Calls 和 Executions 两个概念的区别 使用 dbms_xplan.display 按照 plan_hash_value 查执行计划的方法 oratop 各个指标项说明 [转] sql_id VS hash_value lsattr/chattr [转]节约内存:Instagram的Redis实践 [原]佛山-杭州自驾路书 [摘] python url decoder 一条霸气的分析binlog的命令 一句命令完成MySQL的数据迁移(轻量级) [转]Linux下SSH Session复制 使用taskset命令来限制进程的CPU MySQL重复记录删除 使用Screen抵御杯具 [摘]Oracle 11g Flashback_transaction_query的undo_sql为空? Duplicate Active Database 遇到 ORA-01017 invalid username/password [摘]如何抓住蝴蝶效应中的那只蝴蝶 [原]将Oracle 中的blob导出到文件中
[原] insert into … on duplicate key update / replace into...
killkill · 2012-10-24 · via 博客园 - killkill

场景是这样的,我有KV型的表,建表语句如下:

CREATE TABLE `dkv` (
  `k1` int(11) NOT NULL DEFAULT '0',
  `k2` int(11) NOT NULL DEFAULT '0',
  `val` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`k1`,`k2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

数据大概是这样的:

+----+----+-----------+
| k1 | k2 | val       |
+----+----+-----------+
|  1 |  1 | value 1-1 |
|  1 |  2 | value 1-1 |
|  1 |  3 | value 1-1 |
|  1 |  5 | value 1-1 |
|  1 |  7 | value 1-1 |
+----+----+-----------+

当我插入一条数据时,我要判断(k1,k2)是否已经存在(1条selete),若存在就update,不存在就insert,这是一个典型的merge过程,虽然按照PK执行操作的速度非常快,但是毕竟SQL交互量上去了,如果我有100笔这样的SQL,那这个开销是很可观的,有没有什么一条SQL就能搞定的事情呢?

有两种写法:

第一种: insert into … on duplicate key update

insert DELAYED into dkv 
values 
(1,2,'new 12a'),
(1,3,'new 33ba'),
(1,4,'new 23222'),
(1,6,'new 12333'),
(1,8,'new vaaaa'),
(1,20,'new vaff'),
(1,25,'new vaff')
ON DUPLICATE KEY UPDATE val=VALUES(val);

第二种 replace into:

replace into dkv 
values 
(1,2,'new 12a'),
(1,3,'new 33ba'),
(1,4,'new 23222'),
(1,6,'new 12333'),
(1,8,'new vaaaa'),
(1,20,'new vaff'),
(1,25,'new vaff');

最终都能将数据改成这样:

+----+----+-----------+
| k1 | k2 | val       |
+----+----+-----------+
|  1 |  1 | value 1-1 |
|  1 |  2 | new 12a   |
|  1 |  3 | new 33ba  |
|  1 |  4 | new 23222 |
|  1 |  5 | value 1-1 |
|  1 |  6 | new 12333 |
|  1 |  7 | value 1-1 |
|  1 |  8 | new vaaaa |
|  1 | 20 | new vaff  |
|  1 | 25 | new vaff  |
+----+----+-----------+