MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。另外,ON DUPLICATE KEY UPDATE不能写where条件。

示例:

create table kid_score(
id tinyint unsigned not null,
birth_day date not null,
score int unsigned not null,
primary key(id, birth_day)  --唯一索引是由 id + birth_day 两个字段组成
) engine = InnoDB;
--初始化数据
insert into kid_score(id, birth_day, score) values (1,'2019-01-15',10),(2,'2019-01-16',20);

在这里插入图片描述
下面开始验证执行INSERT ··· ON DUPLICATE KEY UPDATE语法的规则:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。

1. 唯一索引重复

insert into kid_score(id, birth_day, score) values (1,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;

结果:
在这里插入图片描述

2. 唯一索引不重复

insert into kid_score(id, birth_day, score) values (2,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;

结果:
在这里插入图片描述

3. 唯一索引重复,插入完全相同数据

insert into kid_score(id, birth_day, score) values (2,'2019-01-16',20) ON DUPLICATE KEY UPDATE score = 20;

结果:
在这里插入图片描述

4. 影响行数

需要注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2,如果更新的数据和已有的数据一模一样,则受影响的行数是0。

mysql> select * from kid_score;
+----+------------+-------+
| id | birth_day  | score |
+----+------------+-------+
|  1 | 2019-01-15 |    10 |
|  2 | 2019-01-16 |    20 |
+----+------------+-------+
2 rows in set-- 唯一索引重复,执行更新
mysql> insert into kid_score(id, birth_day, score) values (1,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;
Query OK, 2 rows affectedmysql> select * from kid_score;
+----+------------+-------+
| id | birth_day  | score |
+----+------------+-------+
|  1 | 2019-01-15 |    60 |
|  2 | 2019-01-16 |    20 |
+----+------------+-------+
2 rows in set-- 唯一索引不重复,执行插入
mysql> insert into kid_score(id, birth_day, score) values (2,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;Query OK, 1 row affectedmysql> select * from kid_score;
+----+------------+-------+
| id | birth_day  | score |
+----+------------+-------+
|  1 | 2019-01-15 |    60 |
|  2 | 2019-01-15 |    30 |
|  2 | 2019-01-16 |    20 |
+----+------------+-------+
3 rows in set-- 唯一索引重复,应该执行更新,但更新值与原值相同
mysql> insert into kid_score(id, birth_day, score) values (2,'2019-01-16',20) ON DUPLICATE KEY UPDATE score = 20;Query OK, 0 rows affectedmysql> select * from kid_score;
+----+------------+-------+
| id | birth_day  | score |
+----+------------+-------+
|  1 | 2019-01-15 |    60 |
|  2 | 2019-01-15 |    30 |
|  2 | 2019-01-16 |    20 |
+----+------------+-------+
3 rows in set

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis笔记之一次插入多条数据sql语句写法

mybatis笔记之一次插入多条数据sql语句写法

Idea插件——Translation 翻译插件安装与使用

Translation 安装 实现步骤如下: file——setting——plugin——marketplace——输入Translation——点击install——安装完成点击apply应用—ok确认——重启idea才能生效 Translation 使用 选中单词或者段落ctrlshifty翻译,ctrlshifts切换翻译源 ctrlshifty翻译…

Java中BigDecimal类介绍及用法

Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.   其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.   BigDecimal 类的实现用到了 B…

mvn install:install-file将本地一个中央仓库没有的jar包,推到本地仓库----所有依赖不上仓库不能用

mvn install:install-file将本地一个中央仓库没有的jar包,推到本地仓库----所有依赖不上仓库不能用! 前提:maven等环境配置Ok 目标:把中央仓库没有的,部门内部 自研开发的jar,推到私服或者本地服务器,给相…

idea Maven图标的使用

idea Maven图标的使用

Iterator主要有三个方法:hasNext()、next()、remove()详解

Iterator主要有三个方法:hasNext()、next()、remove()详解 一、Iterator的API 关于Iterator主要有三个方法:hasNext()、next()、remove()hasNext:没有指针下移操作,只是判断是否存在下一个元素next:指针下移,返回该指…

Kafka Shell 基本操作

1. 启动集群每个节点的进程 nohup kafka-server-start.sh \ /home/hadoop/apps/kafka_2.11-1.1.0/config/server.properties \ 1>~/logs/kafka_std.log \ 2>~/logs/kafka_err.log &2. 创建 Topic 解释说明: –create --> 创建 Topic 的选项 –zookee…

Linux环境下安装Mysql5.7

本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。 服务器版本Mysql版本Centos 7.65.7.32 1. 下载Mysql 下载地址:https://downloads.mysql.com/archives/community/ 进入页面后选择你需要的版本进行下载,这里提供了2种格式:tar.gz和…

Redis 入门及实战

目录 1. Redis 基本概念 2. Redis 的优势 3. Redis 适用场景 4. Redis-3.2.6 安装(未整理)与测试 5. 使用 Redis 的 Java API 客户端——Jedis 6. 数据结构 6.1 String -- 字符串 6.1.1 String 使用概述 6.1.2 String 常用操作 6.1.3 String 使用案例 6.2 List -- 列…

Flink官网自学笔记

1. What is Apache Flink? Apache Flink 是一款用来进行分布式流数据和批数据处理的开源平台。Apache Flink 是一个对有界数据流和无界数据流进行有状态计算的框架和分布式处理引擎。Flink 被设计用于在所有常见的集群环境中运行,以内存中的速度和任意规模进行计算…

HBase 原理

1. HBase 底层原理 1.1 系统架构 1.1.1 Client 职责 1. HBase 有两张特殊的表: .META.: 记录了用户所有表拆分出来的 Region 映射信息,.META. 可以有多个 Region -ROOT-(新版中已去掉这一层): 记录了 .META. 表的 Region 信息,-ROOT- 只有…

用IDEA debug按键功能

用IDEA debug按键功能 一、断点 断点键,是用户在所选行代码处标记的功能点,表示在debug时代码执行到此处暂停。 注:断点可设置多个 二、启动debug 在设置好断点后单击此功能键,启动debug功能。 三、中止任务 点击该功能键&a…

shiro原理及其运行流程介绍

什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于sp…

shiro中文api_Shiro

1 shiro Apache shiro 是一个 Java 安全框架。 功能:认证、授权、加密和会话管理功能 应用环境:JavaEE、JavaSE Subject 可看做成一个用户 SecurityManager 框架的核心API Reaim 域对象,用于取数据库中的数据,进行权限比对。…

JVM 学习二:类加载器子系统

1 类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件,Class 文件在文件开关有特定的文件标识ClassLoader 只负责 Class 文件的加载,至于它是否可以运行,则由 Execution Engine(执行引擎)决…

JVM 学习三:类加载器

类加载器 1 类加载器的分类 JVM 支持两种类型的类加载器:引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader) 从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定…

JVM 学习四:类加载之双亲委派机制与沙箱安全机制

1 双亲委派机制 Java 虚拟机对 Class 文件的加载采用的是按需加载的方式,也就是说:当需要使用该类时才会将它的 Class 文件加载到内存生成 Class 对象,而且加载某个类的 Class 文件时,Java 虚拟机采用的是双亲委派模式&#xff0c…

Java8新特性:Stream介绍和总结

Java8新特性:Stream介绍和总结 什么是Stream 流(Stream)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 集合讲的是数据,流讲的是计算 注意: Stream自己不会存储元素…

URL传Base64 造成报错 Illegal base64 character 20

报错如下: errorInternal Server Error, messageIllegal base64 character 20, tracejava.lang.IllegalArgumentException: Illegal base64 character 20 at java.util.Base64Decoder.decode0(Base64.java:714)atjava.util.Base64Decoder.decode0(Base64.java:714) …

Linux 中使用 sort 指令分组排序详解

Linux 中使用 sort 指令分组排序详解 sort 中进行分组排序主要用到的选项为 -k,此文,我们着重于该选项的使用方式,用到的其它选项不做解释,有兴趣的同学可以查看帮助文档 1. 数据准备 现有数据如下,文件名 sort_so…