MySQL中insertOrUpdate的功能如何实现的

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: MySQL中的`INSERT INTO ... ON DUPLICATE KEY UPDATE`语句实现insertOrUpdate功能,当遇到重复键时,会更新已有记录。该操作需要表有主键或唯一索引,且冲突时加临时键锁可能引发死锁。例如,向student表插入数据,如果id已存在则更新name和age。底层实现包括检查唯一索引、处理冲突和执行更新。类似语句有REPLACE INTO和INSERT IGNORE INTO。在主键冲突更新时,自增主键计数器仍会增加,即使未实际插入新记录。

insertOrUpdate在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢?

在MySQL中,可采用INSERT INTO ... ON DUPLICATE KEY UPDATE语句实现insertOrUpdate功能。

值得留意的是,在出现重复键时,会在先前索引值和当前值之间添加临时键锁,这可能导致死锁。

若要使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句,需满足以下条件:

  1. 表必须具有主键或唯一索引;
  2. 插入的数据必须包含主键或唯一索引列;
  3. 主键或唯一索引列的值不能为NULL。

举个例子:

设想有一张student表,包括id、name和age三列,其中id是主键。现在要插入一条数据,若该数据的主键已存在,则更新该数据的姓名和年龄,否则插入该数据。

INSERT INTO student (id, name, age) VALUES (1, 'Paidaxing', 20)
ON DUPLICATE KEY UPDATE name='Paidaxing', age=18;

底层实现

使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句,如果数据库中已存在具有相同唯一索引或主键的记录,则更新该记录。其底层原理和执行流程如下:

  1. 检查唯一索引或主键:执行INSERT INTO ... ON DUPLICATE KEY UPDATE语句时,数据库首先尝试插入新行。在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。
  2. 冲突处理:如果不存在冲突的唯一索引或主键,新行将被正常插入。如果存在冲突,即发现重复的唯一索引或主键值,数据库将不会插入新行,而是转而执行更新操作。
  3. 执行更新:在检测到唯一索引或主键的冲突后,数据库将根据ON DUPLICATE KEY UPDATE后面指定的列和值来更新已存在的记录。这里可以指定一个或多个列进行更新,并且可以使用VALUES函数引用原本尝试插入的值。

相似SQL

除了INSERT INTO ... ON DUPLICATE KEY UPDATE之外,还有一些类似的SQL语句,比如:

  1. REPLACE INTO:如果存在唯一索引冲突,则先删除旧记录,再插入新记录。
  2. INSERT IGNORE INTO:如果唯一索引冲突,则忽略该条插入操作,不报错。

浅谈主键跳跃

在MySQL中使用INSERT ON DUPLICATE KEY UPDATE语句时,如果插入操作失败(因为主键或唯一键冲突),而执行了更新操作,确实会导致自增主键计数器增加,即使没有实际插入新记录。

这是因为MySQL在尝试插入新记录时,会先分配一个新的自增主键值,无论后续是插入成功还是执行更新操作,这个主键值都已经被分配并且会增加。

例如,假设有一个表test定义如下:

CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    value VARCHAR(255),
    UNIQUE KEY unique_value (value)
);

然后执行以下语句:

INSERT INTO test (value) VALUES ('a') 
ON DUPLICATE KEY UPDATE value = 'a';

image.png

再执行一次:

image.png

此时,由于value列存在唯一键约束,并且已经存在一条记录value='a',所以不会插入新记录,而是会执行更新操作。但即便如此,自增主键id的计数器依然会增加。

然后再插入一条新的记录:

image.png

这意味着下一次插入新记录时,自增主键的值会比之前增加,即2已经被用过了,虽然没插入成功,但是新的记录就直接用3了。

如有问题,欢迎微信搜索【码上遇见你】。

免费的Chat GPT可微信搜索【AI贝塔】进行体验,无限使用。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 数据库
|
9天前
|
JSON 关系型数据库 MySQL
理解和利用MySQL中的JSON功能
理解和利用MySQL中的JSON功能
33 2
|
2天前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
10天前
|
前端开发 关系型数据库 MySQL
使用 PHP 和 MySQL 实现留言板功能
使用 PHP 和 MySQL 实现留言板功能
32 0
|
13天前
|
SQL 安全 关系型数据库
精通MySQL:核心功能、性能优化与安全管理
h3> 第一章:MySQL入门 1.1 MySQL概述 介绍MySQL的历史、版本发展及其在当前数据库领域的重要地位
|
13天前
|
存储 关系型数据库 MySQL
精通MySQL:核心功能与实践应用
h3> 第一章:MySQL入门 1.1 MySQL概述 简要介绍MySQL的历史、特点以及在数据库领域的应用
|
14天前
|
SQL 存储 关系型数据库
AI代码提示工具可用于教学功能示例——MySQL
AI代码提示工具可用于教学功能示例——MySQL
17 0
|
1月前
|
SQL 存储 关系型数据库
实时数仓 Hologres产品使用合集之有没有MySQL那样的AUTOINCREMENT字段来实现自增ID功能
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
118 5
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用合集之PolarDB MySQL标准版中带有分区功能吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
【5月更文挑战第13天】PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
24 0

热门文章

最新文章

相关产品

  • 云数据库 RDS MySQL 版