最近在做一个阅读次数的需求的时候,有这样一个场景,如果数据库中没有数据,就进行INSERT操作,有数据的话,阅读次数就+1。此处有两种实现方式,一种是想将数据查出来,在Java中进行处理,没有就INSERT,有就+1再UPDATE,这种方式需注意并发操作,并发情况下可能会导致次数少加;另一种就是在数据库层面处理,我们使用的是MySQL,正好MySQL有个语法可以实现这个需求,INSERT INTO ... ON DUPLICATE KEY UPDATE语法。下面我们来浅浅分析下此语法。

INSERT INTO ... ON DUPLICATE KEY UPDATE语法,如果数据库没有数据,就会新增一条数据,如果有数据,就会根据唯一键进行更新对应的值。实现上述需求就可以使用如下SQL:

INSERT INTO t_read (id, article_id, read_count) values (1, 2, 1) ON DUPLICATE KEY UPDATE read_count = read_count + 1;

这里 t_read 表,只是一个示例,id是主键,article_id是唯一键,表中没有数据的话,就会新增一条数据,read_count为1,如果有数据的话,在原read_count上+1赋值给read_count,通过唯一键更新,这样就达到我们的目的啦。可以建一个 t_read 表,将SQL拷贝执行一下,查看数据,就能看到效果啦。如果使用MyBatis的话,在UPDATE之后可以使用 if 标签,进行不同情况下不同值的赋值更新。

MySQL根据该语法执行的操作返回受影响的行数:
     若插入新行,则受影响的rows为 1。
     若更新现有行,则受影响的rows为 2。
     若使用其当前值更新现有行,则受影响的rows为 0。

需要注意,id是自增的话,会导致id自增很快,加上数据量大或者操作频繁的话,可能会导致id溢出。每一次执行,id都会默默增加,这样也会导致自增id不连续。

如图,是我执行了多次上述SQL之后,再新增的数据,id自增就不是连续的了。

大家可以执行一下,看看自增id的影响情况。

行万里路,读万遍经。-- 烟沙九洲

MySQL中INSERT INTO ... ON DUPLICATE KEY UPDATE浅析的更多相关文章

  1. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDA ...

  2. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  3. mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

    replace into和insert into on duplicate key update都是为了解决我们平时的一个问题 就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录. ...

  4. 【转】MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    原文链接:http://www.jb51.net/article/47090.htm   今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on ...

  5. insert into on duplicate key update

    问题 有一个表,建表语句如下: CREATE TABLE `tbl_host` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, `ip` varchar(255) ...

  6. SQL语句实现不存在即插入,存在则increase某字段的功能insert into … on duplicate key update

    前提条件:必须是唯一主键: CREATE UNIQUE INDEX idx_vote_object ON test_customers_vote (`vote_object`, `vote_objec ...

  7. Replace into 与Insert into on duplicate key update的区别

    前提条件:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用这2条语句没有意义.该语句会与INSERT相同 1. Replace into (1)   添加相同的主键 操作前       ...

  8. insert into ... on duplicate key update 与 replace 区别

    on duplicate key update:针对主健与唯一健,当插入值中的主健值与表中的主健值,若相同的主健值,就更新on duplicate key update 后面的指定的字段值,若没有相同 ...

  9. MYSQL的REPLACE和ON DUPLICATE KEY UPDATE使用

    REPLACE 我们在使用数据库时可能会经常遇到这种情况.如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误.当然,我们可能想用新记录 ...

  10. mysql 插入更新判断 ON DUPLICATE KEY UPDATE 和 REPLACE INTO

    平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.此时 插入数据的时候 ,经常会有这样的情况:我们想向数据库插入一条记录: 若数据表中存在以相同主 ...

随机推荐

  1. ubuntu22.04安装DBeaver

    要在 Ubuntu22.04 上安装 DBeaver,可以选择使用 Ubuntu 软件中心的图形界面方法或使用命令行方法通过官方 DBeaver 仓库或 Snap 包安装. 方法一:从官方仓库安装 D ...

  2. 2024 年 C# 高效开发:精选实用类库

    前言 在平时开发中,好的类库能帮助我们快速实现功能,C#有很多封装好的类库. 本文将介绍一些2024年特别受欢迎的C#类库,并分析各自的优点让我们编程写代码变的更轻松.更快捷. 快来看一看有没有大家常 ...

  3. 3.1 gradio的基本使用详解

    ·gr.Text:用于文本输入,适用于自然语言处理任务的模型. gr.Image:用于图像上传,适用于图像处理或计算机视觉模型. ·gr.Audio:用于音频输入,适用于语音识别或音频处理模型. im ...

  4. union联合体的缺陷

    传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制.这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中.以下是传 ...

  5. 日干算命api接口_json数据_性格/爱情/事业/财运/健康运势免费接口

    ​ 该API接口基于传统的八字学原理,通过用户提供的日干信息,为用户提供性格.爱情.事业.财运和健康等多方面的运势分析和建议.以下是该接口的详细介绍: ‌一.功能概述‌ ‌性格分析‌:根据用户的日干信 ...

  6. USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)

    1.概述 如下图所示,Linux内核中USB主机体系结构由五部分组成,分别为Application Software.USB Class Driver.USB Core((USB Driver).US ...

  7. OOOPS:零样本实现360度开放全景分割,已开源 | ECCV'24

    全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息.然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制.为了解决这个问题,论文定义 ...

  8. python reqeusts 请求时headers指定content length后 请求不响应

    解释: HTTP头部中的Content-Length字段表示请求体的大小,用字节来表示.当你在使用Python的requests库进行请求时,如果你手动设置了Content-Length,但实际发送的 ...

  9. Windows 使用 Mingw-w64 配置GCC套件

    Mingw-w64里的gcc和g++应该是很多人常用的编译工具.但是他的下载资源很乱,不好找(注意:MinGW和MinGW-w64是同宗同源的两款软件!),要么就是版本太老.SourceForge上有 ...

  10. Docker Compose容器编排--项目五

    一.Docker Compose概念 Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排(Orchestration ...