前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL中insertOrUpdate的功能如何实现的

MySQL中insertOrUpdate的功能如何实现的

作者头像
@派大星
发布2024-06-08 08:54:18
970
发布2024-06-08 08:54:18
举报
文章被收录于专栏:码上遇见你码上遇见你

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

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

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

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

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

举个例子:

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

代码语言:javascript
复制
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 定义如下:

代码语言:javascript
复制
CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    value VARCHAR(255),
    UNIQUE KEY unique_value (value)
);

然后执行以下语句:

代码语言:javascript
复制
INSERT INTO test (value) VALUES ('a')
ON DUPLICATE KEY UPDATE value = 'a';

再执行一次:

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 底层实现
  • 相似 SQL
    • 浅谈主键跳跃
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档