MySQL中ON DUPLICATE key update的使用
一、主键索引、唯一索引和普通索引的关系
主键索引:
在数据库中定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键
唯一索引:
不允许两行具有相同的索引值。但可以都为NULL。 如果现有数据中存在重复的键值,则数据库不允许将新创建的唯一索引与表一起保存。当新数据和表中的键值重复时,数据库会拒绝接受此数据。每个表可以有多个唯一索引
普通索引:
一般的索引结构,可以在条件删选时加快查询效率,索引字段的值可以重复,可以为空值
二、实战操作
1.ON DUPLICATE key update使用介绍:
有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。这个时候就可以用到ON DUPLICATE key update这个sql语句了。
2.ON DUPLICATE key update测试样例:
首先创一张简单的表:
增加以下数据:
数据包含主键(id):
insert into user (id,username,userpwd,num) values (1,"testName","testPwd",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)
可以看到是根据主键来判断,如果主键重复则执行update。
加上username为唯一索引之后:
再次执行
insert into user (id,username,userpwd,num) values (1,"testName2","testPwd2",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)
可以看到还是根据id来进行判断,如果主键重复则执行update。
测试没有id时:
insert into user (username,userpwd,num) values ("testName2","testPwd3",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)
可以看到,此时是根据唯一索引来进行判断 ,如果唯一索引重复则执行update。
说明优先级:主键>唯一索引
此时测试没有主键和唯一索引重复时的情况:
insert into user (username,userpwd,num) values ("testName4","testPwd4",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)
可以发现,此时是新增一条数据,说明如果主键和唯一索引都不重复的情况执行insert。
三、总结
ON DUPLICATE key update是根据索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。
优先级主键>唯一索引
- 当主键重复时则执行update
- 当主键不重复,唯一索引重复时也执行update
- 当主键和唯一索引值都不重复才执行insert
PS:特殊情况,当主键重复执行update时,如果此时唯一索引字段与其他字段也重复则会报错
到此这篇关于MySQL中ON DUPLICATE key update的使用的文章就介绍到这了,更多相关MySQL ON DUPLICATE key update内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SQL联合查询inner join、outer join和cross join的区别详解
今天小编就为大家分享一篇关于SQL联合查询inner join、outer join和cross join的区别详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03mysql 5.6.26 winx64安装配置图文教程(一)
这篇文章主要为大家详细介绍了mysql 5.6.26 winx64安装配置图文教程,感兴趣的小伙伴们可以参考一下2016-08-08VMWare linux mysql 5.7.13安装配置教程
这篇文章主要为大家详细介绍了VMWare linux mysql 5.7.13安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05最新MySql8.27主从复制及SpringBoot项目中的读写分离实战教程
MySQL主从复制是一个异步的复制过程,底层是基于MySQL1数据库自带的二进制日志功能,这篇文章主要介绍了最新MySql8.27主从复制及SpringBoot项目中的读写分离实战教程,需要的朋友可以参考下2022-08-08
最新评论