服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|

服务器之家 - 数据库 - Mysql - Mysql中Insert into xxx on duplicate key update问题

Mysql中Insert into xxx on duplicate key update问题

2019-12-06 15:53MYSQL教程网 Mysql

在看代码的过程中碰到了这一用法,不太理解,google了一下。它的意义其实是如果在insert语句末尾制定了on duplicate key update语句的话,则当插入行会导致一个unique索引或者primary key中出现重复值,则执行update中的语句,否则才插入新

例如,如果列a被定义为unique,并且值为1,则下列语句有同样的效果,也就是说一旦出入的记录中存在a=1的情况,直接更新c = c + 1,而不执行c = 3的操作。 

复制代码代码如下:


insert into table(a, b, c) values (1, 2, 3) on duplicate key 
update c = c + 1;1 update table set c = c + 1 where a = 1; 


另外值得一提的是,这个语句知识mysql中,而标准sql语句中是没有的。 

INSERT INTO .. ON DUPLICATE KEY更新多行记录 

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

复制代码代码如下:


INSERT INTO TABLE (a,b,c) 
VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; 
UPDATE TABLE SET c=c+1 WHERE a=1; 


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

如果你想了解更多关于INSERT INTO .. ON DUPLICATE KEY的功能说明,详见MySQL参考文档:13.2.4. INSERT语法 

现在问题来了,如果INSERT多行记录, ON DUPLICATE KEY UPDATE后面字段的值怎么指定?要知道一条INSERT语句中只能有一个ON DUPLICATE KEY UPDATE,到底他会更新一行记录,还是更新所有需要更新的行。这个问题困扰了我很久了,其实使用VALUES()函数一切问题都解决了。 

举个例子,字段a被定义为UNIQUE,并且原数据库表table中已存在记录(2,2,9)和(3,2,1),如果插入记录的a值与原有记录重复,则更新原有记录,否则插入新行: 

复制代码代码如下:


INSERT INTO TABLE (a,b,c) VALUES 
(1,2,3), 
(2,5,7), 
(3,3,6), 
(4,8,2) 
ON DUPLICATE KEY UPDATE b=VALUES(b); 


以上SQL语句的执行,发现(2,5,7)中的a与原有记录(2,2,9)发生唯一值冲突,则执行ON DUPLICATE KEY UPDATE,将原有记录(2,2,9)更新成(2,5,9),将(3,2,1)更新成(3,3,1),插入新记录(1,2,3)和(4,8,2) 

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

延伸 · 阅读

精彩推荐
  • MysqlCentos7 安装mysql 8.0.13(rpm)的教程详解

    Centos7 安装mysql 8.0.13(rpm)的教程详解

    这篇文章主要介绍了Centos7 安装mysql 8.0.13(rpm)的教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    斑马虾软件1952019-06-18
  • MysqlMysql5 字符集编码问题解决

    Mysql5 字符集编码问题解决

    mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问...

    mysql教程网1642019-11-01
  • MysqlMySQL 双向备份的实现方法

    MySQL 双向备份的实现方法

    这篇文章主要介绍了MySQL 双向备份的实现方法,即两个 MySQL 服务都是 Master,其中任意一个服务又是另一个服务的 Slave,感兴趣的可以了解一下...

    魏晋秋2412019-06-25
  • Mysqlmysql Myisamchk小工具使用手册

    mysql Myisamchk小工具使用手册

    Myisamchk是MyISAM表维护的一个非常实用的工具。可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和...

    mysql教程网3872019-10-24
  • Mysql分析Mysql表读写、索引等操作的sql语句效率优化问题

    分析Mysql表读写、索引等操作的sql语句效率优化问题

    今天小编就为大家分享一篇关于分析Mysql表读写、索引等操作的sql语句效率优化问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需...

    执笔记忆的空白3382019-06-13
  • MysqlPHP访问MySQL查询超时处理的方法

    PHP访问MySQL查询超时处理的方法

    PHP连接MySQL主要是使用Mysql提供的 libmysqlclient 的客户端库,同时也延伸出来 mysql 和 mysqli 两套PHP的扩展,相对来说 mysqli 比 mysql 更好,更稳定。 ...

    heiyeluren的blog1882019-11-18
  • Mysqlmysql 基本操作

    mysql 基本操作

    早打算写些关于数据库操作方面的知识了,现在终于完成了第一篇,以下记录了关于mysql操作方面的基础知识 ...

    MYSQL教程网1102019-12-06
  • MysqlTable ‘xxx’ is marked as crashed and should be repaired 错误解决方法参考

    Table ‘xxx’ is marked as crashed and should be repaired 错误解决方法参考

    这些东西都是从其他地方找来的一些解决MYSQL数据库这个错误的方法,并不一定适用于神迹数据库,仅仅供参考一下,具体的解决方法还是需要摸索。 ...

    mysql教程网2322019-10-26