insert into … on duplicate key update / replace into 多行数据介绍_Mysql

场景是这样的,我有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  |
+----+----+-----------+

时间: 2024-09-02 04:54:53

insert into … on duplicate key update / replace into 多行数据介绍_Mysql的相关文章

MySQL的Replace into 与Insert into on duplicate key update真

看下面的例子吧: 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 

mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法

MySQL 自4.1版以后开始支持INSERT - ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成. 例如ipstats表结构如下:  代码如下 复制代码 CREATE TABLE ipstats ( ip VARCHAR(15) NOT NULL UNIQUE, clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' ); 原本需要执行3条SQL语句

INSERT ... ON DUPLICATE KEY UPDATE Syntax

一 mybatis中返回自动生成的id 当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢.在mysql数据中我们可以在insert下添加一个selectKey用以指定返回的类型和值 <insert id="xxx" parammeterType="xxx"> <selectKey resultType="java.lang.Integer" order="AFTER&quo

MYSQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例_Mysql

在对看看的后台进行排序的时候,遇到了一个像这样的需求,在电影表中有ID(主键自增)和orderby(排序字段) ,假设有十条数据id分别从1-10之间,对应的orderby也是从1-10之间,我现在想把id=9的数据移动到第三的位置(id=3)的这个位置,并且保证之前的数据排列顺序(即id=3的orderby=4,id=4的orderby=5-id=8的orderby=9),这样如果用循环的形式是可以解决数据的问题,但是这样操作数据库过程太多,现在就想用一条sql语句来解决这个问题. 下面来看看

mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )_Mysql

INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INT

MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:  代码如下 复制代码 1 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163.com', '99999', '9999'); 这样当有重复记录就会忽略,执行后返回数字0 还有个应用就是复制表,避免重复记录:  代码如下 复制代码 1 INSERT IGNORE

深入mysql &quot;ON DUPLICATE KEY UPDATE&quot; 语法的分析

mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: 复制代码 代码如下: INSERT INTO TABLE (a,c) VALUES

深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析

mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不会导致唯一值列重复的问题,则插入新行. 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON

mysql 有就插入没有就更新 on DUPLICATE key update批量更新

on DUPLICATE key update批量更新 mysql有个批量更新的方法,mssql则无此命令用法,mysql的这个方法可以用来批量更新,更为强大的是:如果参数已存在则更新,如果数据库里没有这个参数就插入新的. 举例 insert into xinhuazidian (a, b, c) VALUES ('aaa','bbb','lao8.org'),  ('aaa2','bbb2','m.lao8.org') on DUPLICATE key update b=VALUES(b),