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翻译…

INSERT IGNORE 与INSERT INTO的区别

INSERT IGNORE 与INSERT INTO的区别 INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据&#xff0…

java中Date日期类型的大小比较

java中Date日期类型的大小比较 方法一: java.util.Date类实现了Comparable接口,可以直接调用Date的compareTo()方法来比较大小 String beginTime "2018-07-28 14:42:32"; String endTime "2018-07-29 12:26:32";SimpleDateFormat format …

Java8 中 List 转 Map(Collectors.toMap) 使用技巧

Java8 中 List 转 Map(Collectors.toMap) 使用技巧 在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子: 先定义类: // 简单对象 Accessors(chain true) // 链式方法 lombok.Data clas…

BeautifulSoup入门案例

import beautifulsoup4 as bsimport requestsurl "http://www.baidu.com"html requests.get(url) # 获取网页响应对象html.encoding utf-8 # 修改网页响应对象(requests.models.Response)的编码格式content html.text # 获取网页的内容…

MySQL中concat函数(连接字符串)

MySQL中concat函数(连接字符串) MySQL中concat函数 使用方法: concat(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。 mysql> select concat(‘11’,‘22’,‘33’); ---------…

复制Linux虚拟机后的网卡问题解决

以CentOS为例: 首先修改: /etc/sysconfig/network-scripts/ifcfg-eth0 此文件中的DEVICEeth0要与文件名中的网卡名一致,并且此文件中的网卡的HWADDR要与下面文件中对应的网卡的HWADDR一致 再修改: /etc/udev/rules.d/70-persiste…

模糊查询 LIKE CONCAT()的使用

模糊查询 LIKE CONCAT()的使用 LIKE CONCAT() 根据学生名称模糊查询学生信息 sql语句实现 select stuName from student where stuName LIKE CONCAT(’%’, ‘张’, ‘%’)mybatis实现: select stuName from student where stuName LIKE CONCAT (’%’,#{stuNa…

Linux中的shell正则表达式详解

Shell中使用正则表达式处理文本的命令有如下工具: 命令描述grep默认不支持扩展表达式,加-E选项开启ERE。如果不加-E,此时使用花括号时要加转义符:\{\}egrep支持基础和扩展表达式awk支持基础和扩展表达式sed默认不支持扩展表达式&…

java编码问题详解

import java.io.UnsupportedEncodingException; import java.util.Arrays;/*编码: 字符变成字节数组解码: 字节数组变成字符串String --> byte[] : str.getBytes()byte[] --> String : new String(byte[])*/public class EncodeDemo {public…

JDK1.8 新特性(全)

JDK1.8 新特性 本文主要介绍了JDK1.8版本中的一些新特性,乃作者视频观后笔记,仅供参考。 jdk1.8新特性知识点: Lambda表达式函数式接口方法引用和构造器调用Stream API接口中的默认方法和静态方法新时间日期API 在jdk1.8中对hashMap等map集…

Java中BigDecimal类介绍及用法

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

java中的生产者消费者模式详解

方式 一: Synchronized方式 注:此种方式会造成资源的浪费: 利用锁的notifyAll()方法会将所有的线程都唤醒,会造成资源的浪费 class Resource {private String name;private int count 1;private boolean flag false;public syn…

Python IO 基本编程示例

一. 基本概念 同步和异步 同步:CPU 等待 IO 的执行结果 异步:CPU 不等待 IO 的执行结果 即:同步和异步的区别就是是否等待 IO 执行的结果 回调模式 打个比方:汉堡做好后,服务员跑来告诉你,这就是回调 轮询…

mysql中in的用法详解

mysql中in的用法详解 一、基础用法 mysql中in常用于where表达式中,其作用是查询某个范围内的数据。 select * from where field in (value1,value2,value3,…)当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择 s…

keyProperty=“id“ 和useGeneratedKeys=“true“作用

keyProperty“id“ 和useGeneratedKeys“true“作用 使用 mysql 自增长序列&#xff0c;新插入一条数据时&#xff0c;怎么得到主键&#xff1f; 加入以下属性即可&#xff1a; useGeneratedKeys“true” keyProperty“id” <insert id"insertSelective" para…

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

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

ZooKeeper 的工作流程

ZooKeeper 集群中的角色简介&#xff1a; Leader&#xff1a; 负责发起投票和决议&#xff0c;更新系统状态Follower&#xff1a;用于接收客户端请求并向客户端返回结果&#xff0c;在选主过程中参与投票Observer&#xff1a; 可以接收客户端连接&#xff0c;将写请求转发给 L…

TikTok真题第4天 | 1366. 通过投票对团队排名、1029.两地调度、562.矩阵中最长的连续1线段

1366. 通过投票对团队排名 题目链接&#xff1a;rank-teams-by-votes/ 解法&#xff1a; 这道题就是统计每个队伍在每个排名的投票数&#xff0c;队伍为A、B、C&#xff0c;则排名有1、2、3&#xff0c;按照投票数进行降序排列。如果有队伍在每个排名的投票数都一样&#xf…