ON DUPLICATE KEY UPDATE

INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?
前提条件是这个表必须有一个唯一索引或主键。

1、REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。
2、INSERT发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。

这样REPLACE的操作成本要大于 insert  ON DUPLICATE KEY UPDATE>.  按照 odds 的 代码 ,按道理应该选用insert  ON DUPLICATE KEY UPDATE


部分测试如下
2个 都是 影响的数据栏: 2
时间: 0.000ms
mysql insert的几点操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )

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]

       [INTO] tbl_name

       SET col_name={expr | DEFAULT}, ...

       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

       [INTO] tbl_name [(col_name,...)]

       SELECT ...

       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]



一、DELAYED 的使用

     使用延迟插入操作

DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候,

服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户

端就可以在数据表被真正地插入记录之前继续进行操作了。如果读取者从该数据

表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器

开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器

还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,

允许读取者继续操作。当没有读取者的时候,服务器再次开始插入延迟的数据行。

这个过程一直进行,直到队列空了为止。

几点要注意事项:

· INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED...SELECT语句的DELAYED。

· 服务器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE语句的DELAYED。

· 因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。

· 对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。

· DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。

注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)

或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。

二、IGNORE的使用

IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,

或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTER TABLE的运行。

如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。

如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。

并且,对错误值进行修正,使之尽量接近正确值。

insert ignore into tb(...) value(...)

这样不用校验是否存在了,有则忽略,无则添加



三、ON DUPLICATE KEY UPDATE的使用

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)



       -> ON DUPLICATE KEY UPDATE c=c+1;







mysql> UPDATE table SET c=c+1 WHERE a=1;



如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。



注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:



mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;



如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。



您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果 没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。 VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。



示例:



mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)



       -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);



本语句与以下两个语句作用相同:



mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)



       -> ON DUPLICATE KEY UPDATE c=3;



mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)



       -> ON DUPLICATE KEY UPDATE c=9;



当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。







总结:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。



        ignore     只关注主键对应记录是不存在,无则添加,有则忽略。



     ON DUPLICATE KEY UPDATE 在添加时操作,关注非主键列,注意与ignore的区别。有则更新指定列,无则添加。
posted on 2008-08-22 14:17 鱼有所思 阅读(3997) 评论(1)  编辑 收藏 引用 网摘 所属分类: MySQL

评论:
# MySQL INSERT ... ON DUPLICATE KEY UPDATE 2008-08-22 14:26 | 鱼有所思
INSERT ... ON DUPLICATE KEY UPDATE,当插入的记录会引发主键冲突或者违反唯一约束时,则使用UPDATE更新旧的记录,否则插入新记录。

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid | int(11) | NO | PRI | | |
| uname | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from test;
+-----+--------+
| uid | uname |
+-----+--------+
| 1 | uname1 |
| 2 | uname2 |
| 3 | me |
+-----+--------+
3 rows in set (0.00 sec)

mysql> INSERT INTO test values ( 3,'insertName' )
-> ON DUPLICATE KEY UPDATE uname='updateName';
Query OK, 2 rows affected (0.03 sec)

mysql> select * from test;+-----+------------+
| uid | uname |
+-----+------------+
| 1 | uname1 |
| 2 | uname2 |
| 3 | updateName |
+-----+------------+
3 rows in set (0.00 sec)

mysql> create index i_test_uname on test(uname);
Query OK, 3 rows affected (0.20 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> INSERT INTO test VALUES ( 1 , 'uname2') -> ON DUPLICATE KEY UPDATE uname='update2records';Query OK, 2 rows affected (0.00 sec)

mysql> select * from test;+-----+----------------+
| uid | uname |
+-----+----------------+
| 2 | uname2 |
| 1 | update2records |
| 3 | updateName |
+-----+----------------+
3 rows in set (0.00 sec)

插入时会与两条记录发生冲突,分别由主键和唯一索引引起。但最终只UPDATE了其中一条。这在手册中也说明了,有多个唯一索引(或者有键也有唯一索引)的情况下,不建议使用该语句。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

os.path 模块

os.path.abspath(path) #返回绝对路径os.path.basename(path) #返回文件名os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。os.path.dirname(path) #返回文件路径os.path.exists(path) #路径存在则返回True,路径损坏返回Falseos.path…

探索性数据分析(EDA):Python

什么是探索性数据分析(EDA)? (What is Exploratory Data Analysis(EDA)?) If we want to explain EDA in simple terms, it means trying to understand the given data much better, so that we can make some sense out of it.如果我们想用简单的术语来解释EDA&a…

微服务框架---搭建 go-micro环境

1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULEon export GOPROXYhttps://goproxy.io # windows下设置如下环境变量 setx GO111MODULE on setx GOPROXY https://goproxy.io # 使用如下指令安装 go get -u -v github.com/micro/micro go get -u -v github.co…

angular dom_Angular 8 DOM查询:ViewChild和ViewChildren示例

angular domThe ViewChild and ViewChildren decorators in Angular provide a way to access and manipulate DOM elements, directives and components. In this tutorial, well see an Angular 8 example of how to use the two decorators.Angular中的ViewChild和ViewChild…

浪潮之巅——IT产业的三大定律

http://www.cnblogs.com/ysocean/p/7641540.html转载于:https://www.cnblogs.com/czlovezmt/p/8325772.html

DStream算子讲解(一)

先把目录列好,方便有条理的进行整理转载于:https://www.cnblogs.com/leodaxin/p/7507600.html

aws 静态网站_如何使用AWS托管静态网站-入门指南

aws 静态网站When I created my first portfolio last year, I based it on what I had learned from freeCodeCamp (HTML, CSS and a little JavaScript). 去年创建我的第一个投资组合时 ,我基于从freeCodeCamp (HTML,CSS和一些JavaScript)中学到的知识…

leetcode 27. 移除元素(双指针)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

使用TVP批量插入数据

TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性。顾名思义,表值参数表示你可以把一个表类型作为参数传递到函数或存储过程里。 第一步:创建一个Type类型和写入数据的原始表结构相…

python:找出两个列表中相同和不同的元素(使用推导式)

#接口返回值 list1 [张三, 李四, 王五, 老二] #数据库返回值 list2 [张三, 李四, 老二, 王七]a [x for x in list1 if x in list2] #两个列表表都存在 b [y for y in (list1 list2) if y not in a] #两个列表中的不同元素print(a的值为:,a) print(b的值为:,b)c [x for x …

springcloud(六):配置中心git示例

随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多。某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错。配置中心便…

写作工具_4种加快数据科学写作速度的工具

写作工具I’ve been writing about data science on Medium for just over two years. Writing, in particular, technical writing can be time-consuming. Not only do you need to come up with an idea, write well, edit your articles for accuracy and flow, and proofr…

leetcode 91. 解码方法(dp)

解题思路 记忆化搜索,记录已经计算过的子问题 代码 func numDecodings(s string) int {temp:make([]int,len(s),len(s))for i : range temp {temp[i]-1}return de(s,0,temp) } func de(s string,cur int,dp []int) int {if curlen(s){return 1}if dp[cur]!-1{re…

python数据结构与算法

2019独角兽企业重金招聘Python工程师标准>>> http://python.jobbole.com/tag/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 转载于:https://my.oschina.net/u/3572879/blog/1611369

test5

test5 转载于:https://www.cnblogs.com/Forever77/p/11468284.html

ux和ui_阅读10个UI / UX设计系统所获得的经验教训

ux和uiAs a way to improve my UI/UX skills I decided to read the guidelines for 10 popular UI/UX design systems. In this article I will give you a concise summary of the most important concepts. 为了提高我的UI / UX技能,我决定阅读10种流行的UI / UX…

大数据(big data)_如何使用Big Query&Data Studio处理和可视化Google Cloud上的财务数据...

大数据(big data)介绍 (Introduction) This article will show you one of the ways you can process stock price data using Google Cloud Platform’s BigQuery, and build a simple dashboard on the processed data using Google Data Studio.本文将向您展示使用Google Cl…

第1次作业:阅读优秀博文谈感想

摘要:本文介绍第1次作业的详细内容,包括评分标准。 注:本次作业提交截止时间为UTC8(北京时间),2017-9-17 22:00(星期日),以博客发表日期为准。 1. 作业内容 阅读一些优秀博文(见第二…

ubuntu 16.04常用命令

ip配置: 终端输入vi /etc/network/interfaces命令编辑配置文件,增加如下内容:         auto enp2s0    iface enp2s0 inet static    address 192.168.1.211    netmask 255.255.255.0    gateway 192.168.1.1 重启网卡&#xf…

leetcode 28. 实现 strStr()(kmp)

实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们…