mysql特殊语法insert into .. on duplicate key update ..使用方法详析

 更新时间:2023年04月12日 10:59:38   作者:秃秃爱健身  
在我们的日常开发中经常会遇到过这样的情景,查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段,下面这篇文章主要给大家介绍了关于mysql特殊语法insert into .. on duplicate key update ..使用方法的相关资料,需要的朋友可以参考下

一、前言

在日常开发中,经常会遇到这样的需求:查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段。

比如下列伪代码:

$row = mysql_query($result);

if($row){

mysql_execute('update ...');

}else{

mysql_execute('insert ...');

}

二、insert into … on duplicate key update …

MySql针对此,提供了insert into … on duplicate key update …的语法:

  • 在insert的时候,如果insert的数据会引起唯一索引(包括主键索引)的冲突,即唯一值重复了,则不会执行insert操作,而执行后面的update操作。

注意:这个是MYSQL特有的,不是SQL标准语法;

1、处理逻辑

insert into … on duplicate key update …语句是根据唯一索引判断记录是否重复的;

  • 如果不存在记录,插入,则影响的行数为1;
  • 如果存在记录,可以更新字段,则影响的行数为2;
  • 如果存在记录,并且更新的值和原有的值相同,则影响的行数为0。

如果表同时存在多个唯一索引,只会根据第一个在数据库中存在相应value的唯一索引做duplicate判断:

2、示例:

表结构

CREATE TABLE `user2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(94) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(1) DEFAULT NULL,
  `type` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idex_name` (`userName`) USING BTREE,
  KEY `idx_type` (`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

user2表中有一个主键id、一个唯一索引idx_userName;

1> 不存在记录,插入的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

2> 存在记录,可以更新字段的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

3> 存在记录,不可以更新字段的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

4> 存在多个唯一索引时

如果表同时存在多个唯一索引,只会根据第一个在数据库中存在相应value的唯一索引做duplicate判断:

1)数据库中id = 12的记录不存在,userName="saint22"的记录存在,所以会根据第二个唯一索引userName做duplicate判断;

insert into user2(id, userName, age, gender) VALUES(12, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 80;

2)数据库中id = 10的记录存在,userName="saint22"的记录存在,所以会根据第一个唯一索引id做duplicate判断;

insert into user2(id, userName, age, gender) VALUES(10, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 90;

3、Update子句获取inset部分的值

Update子句可以使用values(col_name)获取insert部分的值:

insert into user2(userName, age, gender) VALUES("saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(age) + 100;

注意:VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL;

4、last_insert_id()

如果表含有auto_increment字段,使用insert … on duplicate key update插入或更新后,last_insert_id()返回auto_increment字段的值。

总结

到此这篇关于mysql特殊语法insert into .. on duplicate key update ..使用方法的文章就介绍到这了,更多相关insert into .. on duplicate key update内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中库的基本操作指南(推荐!)

    MySQL中库的基本操作指南(推荐!)

    MySQL这个数据库是一个客户端-服务器结构的程序,下面这篇文章主要给大家介绍了关于MySQL中库的基本操作指南,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • MySQL通过自定义函数实现递归查询父级ID或者子级ID

    MySQL通过自定义函数实现递归查询父级ID或者子级ID

    这篇文章主要介绍了MySQL通过自定义函数实现递归查询父级ID或者子级ID,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Mysql中时间戳转为Date的方法示例

    Mysql中时间戳转为Date的方法示例

    这篇文章主要给大家介绍了关于Mysql中时间戳转为Date的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 探讨:innodb与myisam在存储上有何特点和区别

    探讨:innodb与myisam在存储上有何特点和区别

    本篇文章是对innodb与myisam在存储上有何特点和区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL联合索引遵循最左前缀匹配原则

    MySQL联合索引遵循最左前缀匹配原则

    这篇文章主要介绍了MySQL联合索引遵循最左前缀匹配原则, MySQL联合索引遵循最左前缀匹配原则,即最左优先,查询的时候会优先匹配最左边的索引
    2022-08-08
  • MySQL切分函数substring()的具体使用

    MySQL切分函数substring()的具体使用

    这篇文章主要介绍了MySQL切分函数substring()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL通配符与正则表达式搜过滤数据详解

    MySQL通配符与正则表达式搜过滤数据详解

    简单来说,正则表达式就是用来匹配文本的特殊字符串,下面这篇文章主要给大家介绍了关于MySQL通配符与正则表达式搜过滤数据的相关资料,文中通过实例代码以及图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • mysql和sqlserver查询数据库表的数量方法详解

    mysql和sqlserver查询数据库表的数量方法详解

    这篇文章主要介绍了mysql和sqlserver查询数据库表的数量方法详解,本文给大家分享SQL语句写法,文末补充介绍了查询sqlserver 数据库中各表条数的语句,需要的朋友可以参考下
    2023-07-07
  • MySQL的join buffer原理

    MySQL的join buffer原理

    这篇文章主要介绍了MySQL的join buffer原理,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-04-04
  • Win10 64位使用压缩包安装最新MySQL8.0.18的教程(图文详解)

    Win10 64位使用压缩包安装最新MySQL8.0.18的教程(图文详解)

    本文通过图文并茂的形式给大家介绍了WIN10 64位使用压缩包安装最新MySQL8.0.18的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12

最新评论