mysql-on duplicate key update实现insertOrUpdate官方文档

【README】

mysql 基于 on duplicate key update filed=value ; 实现有则更新,没有则插入;

以下内容总结于  https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

【1】api 描述

如果指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会发生旧行的 UPDATE。 例如,如果列 a 声明为 UNIQUE 并包含值 1,则以下两个语句具有类似的效果:

INSERT INTO t1 (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=c+1;UPDATE t1 SET c=c+1 WHERE a=1;

效果并不完全相同:对于 a 是自增列的 InnoDB 表,INSERT 语句增加自增值,但 UPDATE 不会。如果列 b 也是唯一的,则 INSERT 等效于此 UPDATE 语句

UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

也就说, 表t1 要有唯一键,才能保证实现新增或更新的效果; 因为主键肯定不一样;

注意:如果 a=1 OR b=2 匹配多行,则只更新一行。 通常,您应该尽量避免在具有多个唯一索引的表上使用 ON DUPLICATE KEY UPDATE 子句。


【1.1】更新行数

使用 ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果现有行设置为其当前值,则为 0。 如果在连接到 mysqld 时为 mysql_real_connect() C API 函数指定 CLIENT_FOUND_ROWS 标志,则如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。


【1.2】可以更新多个列

ON DUPLICATE KEY UPDATE 子句可以包含多个列分配,以逗号分隔。

INSERT INTO t1 (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=c+1, c2=2, c3=3;

【1.3】 values() 函数引用值

可以使用 VALUES(col_name) 函数来引用来自 INSERT ... ON DUPLICATE KEY UPDATE 语句的 INSERT 部分的列值。 换句话说,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指将插入的 col_name 的值,没有发生重复键冲突。 此函数在多行插入中特别有用。 VALUES() 函数仅在 ON DUPLICATE KEY UPDATE 子句或 INSERT 语句中有意义,否则返回 NULL。 例子:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
-- 等价于
INSERT INTO t1 (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)ON DUPLICATE KEY UPDATE c=9;

注意: 从 MySQL 8.0.20 开始,不推荐使用 VALUES() 来引用新的行和列(可能会被删除),并且在未来的 MySQL 版本中可能会被删除。 相反,使用行和列别名,如本节接下来的几段所述。


【1.4】为行使用别名(mysql8.0.19才可以,注意版本)

从 MySQL 8.0.19 开始,可以为行使用别名,可以选择插入一个或多个列,在 VALUES 或 SET 子句之后,并以 AS 关键字开头。 使用行别名 new,前面显示的使用 VALUES() 访问新列值的语句可以写成如下所示的形式:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS newON DUPLICATE KEY UPDATE c = new.a+new.b;-- 等价于INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)ON DUPLICATE KEY UPDATE c = m+n;

补充: 从 MySQL 8.0.20 开始,在 UPDATE 子句中使用 VALUES() 的 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE 语句会抛出警告:

INSERT INTO t1SELECT c, c+d FROM t2ON DUPLICATE KEY UPDATE b = VALUES(b);-- 等价于
INSERT INTO t1SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dtON DUPLICATE KEY UPDATE b = e; 

【1.5】将行和列别名与 SET 子句一起使用,而不用values

在刚刚显示的两个 INSERT ... ON DUPLICATE KEY UPDATE 语句中使用 SET 而不是 VALUES 可以如下所示完成:

INSERT INTO t1 SET a=1,b=2,c=3 AS newON DUPLICATE KEY UPDATE c = new.a+new.b;INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)ON DUPLICATE KEY UPDATE c = m+n;

【1.6】行别名不能与表名相同。

如果未使用列别名,或者它们与列名相同,则必须使用 ON DUPLICATE KEY UPDATE 子句中的行别名来区分它们。 列别名对于它们所应用的行别名必须是唯一的(即,没有引用同一行列的列别名可能是相同的)。


【2】insert ... select ... on duplicate key update (不建议使用,不安全,参见文末)

对于 INSERT ... SELECT 语句,这些规则适用于可以在 ON DUPLICATE KEY UPDATE 子句中引用的可接受形式的 SELECT 查询表达式:

  • 对来自单个表(可能是派生表)的查询的列的引用。
  • 对多个表的连接查询中的列的引用。
  • 对来自 DISTINCT 查询的列的引用。
  • 引用其他表中的列,只要 SELECT 不使用 GROUP BY。 一个副作用是您必须限定对非唯一列名的引用。

【2.1】不支持从 UNION 引用列。

要解决此限制,请将 UNION 重写为派生表,以便可以将其行视为单表结果集。 例如,此语句会产生错误(语法错误):

INSERT INTO t1 (a, b)SELECT c, d FROM t2UNIONSELECT e, f FROM t3
ON DUPLICATE KEY UPDATE b = b + c;

相反,使用将 UNION 重写为派生表的等效语句(语法正确)

INSERT INTO t1 (a, b)
SELECT * FROM(SELECT c, d FROM t2UNIONSELECT e, f FROM t3) AS dt
ON DUPLICATE KEY UPDATE b = b + c;

【2.2】支持group by

将查询重写为派生表的技术还支持从 GROUP BY 查询引用列。


【2.3】INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句是不安全的

因为 INSERT ... SELECT 语句的结果取决于来自 SELECT 的行的顺序,并且无法始终保证此顺序,所以在记录 INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句时源和副本可能会出现分歧 . 因此,对于基于语句的复制,INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句被标记为不安全(谨慎使用 insert ... select on duplicate key update )。

此类语句在使用基于语句的模式时会在错误日志中产生警告,并在使用 MIXED 模式时使用基于行的格式写入二进制日志。 针对具有多个唯一键或主键的表的 INSERT ... ON DUPLICATE KEY UPDATE 语句也被标记为不安全。 (错误#11765650,错误#58637)

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

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

相关文章

python统计段落单词词频_使用Python统计文件中词频,并且生成词云

wordcloud Table of Contents 1 怎样使用Python产生词云 from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba # Now, There is no word.txt under this path path_txt "/home/alan/Desktop/word.txt" f open(path_txt, r, encoding U…

IDEA中maven配置MyBatis简单流程

前言 刚学完javaweb,对自己的Dao层代码很不满意的话,可得来学学MyBatis。学习MyBatis既可以改进JDBC的使用,实现Dao层也会变得很简便,下面我将介绍IDEA中maven配置MyBatis简单流程。 如果想了解maven请转到我的上一篇文章中&…

(转)构建微服务:Spring boot 入门篇

转自: Spring Boot(一):入门篇 - 纯洁的微笑 - 博客园 ; 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#…

python参数_python参数的介绍

一、函数 1.为什么要使用函数? 减少代码的冗余 2.函数先定义后使用(相当于变量一样先定义后使用) 3.函数的分类: 内置函数:python解释器自带的,直接拿来用就行了 自定义函数:根据自己的需求自己…

一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)

前言 过了web这个阶段了,项目也完成了的我想给各位后来者总结一下我整个项目从开始到结束的经验,当然,也不是一帆风顺,报错有时候折磨的要死,废话不多说,现在就开始吧。 本文一共分为两个部分:…

HashMap 实现原理

转载自 HashMap 实现原理HashMap是常考点,而一般不问List的几个实现类(偏简单)。以下基于JDK1.8.0_102分析。 内部存储 HashMap的内部存储是一个数组(bucket),数组的元素Node实现了是Map.Entry接口(hash, key, value, next)&#…

mybatis-启动源码分析

【1】测试用例 mybatis-config.xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configurat…

git 合并冲突_git分支管理的策略和冲突问题

备注&#xff1a;知识点关于分支中的冲突分支管理的策略分支策略备注&#xff1a;本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录&#xff0c;感谢其无私分享&#xff0c;也欢迎各位查看原文。知识点git log --graph --prettyoneline --abbrev-commit查看分支合…

mysql duplicate key与replace into对比

【REDME】 有些业务场景如下&#xff1a; 对于数据已经存在的&#xff0c;则更新&#xff1b;否则新增&#xff1b; 怎么判定数据已经存在&#xff0c;通过主键或唯一索引来判断&#xff1b; 业务场景&#xff1a;业务库的全局参数表的参数值的新增或更新就是 有则更细无则…

基于springboot+vue的前后端分离商城系统

springboot前后端分离商城 介绍 springboot前后端分离商城 本项目由本人根据教程实现的一个springboot项目&#xff0c;基本已实现项目&#xff0c;但是本人希望加入自己的小功能&#xff0c; 请期待下一次的更新~ 教程地址&#xff1a;教程 软件架构 软件架构说明: 本项目…

Java 8 HashMap键与Comparable接口

转载自 Java 8 HashMap键与Comparable接口 这篇文章主要介绍了 Java 8 在 HashMap 哈希冲突处理方面的新特性。 相对之前的版本&#xff0c;Java 8 在许多方面有了提升。其中有很多类被更新了&#xff0c;HashMap 作为最常使用的集合类之一也不例外。这篇文章将介绍 Java 8 中…

hash地址_一致性Hash在负载均衡中的应用

作者&#xff1a;marklux原文&#xff1a;http://marklux.cn/blog/90简介一致性Hash是一种特殊的Hash算法&#xff0c;由于其均衡性、持久性的映射特点&#xff0c;被广泛的应用于负载均衡领域&#xff0c;如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。本文…

(转)linux上nginx源码编译安装

亲测有效&#xff1b; 转&#xff1a; https://segmentfault.com/a/1190000007116797https://segmentfault.com/a/1190000007116797 nginx服务器详细安装过程&#xff08;使用yum 和 源码包两种安装方式&#xff0c;并说明其区别&#xff09; 正在上传…重新上传取消​fuyi…

牛客网JAVA专项联系共899题--个人记录学习经历

总览 共刷900题 其中也有许多知识点是未曾涉足的&#xff0c;但大部分还是java的基础。 基本数据 正确题数&#xff1a;正确率百分之67&#xff0c;即&#xff1a;对了603题&#xff1b; 时间&#xff1a;5天&#xff08;每天4小时左右&#xff09; 错题&#xff1a; 收藏数…

ffmpeg中文开发手册_快速调用复杂命令,支持中文注释,命令行备忘工具navi两天就火了...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI刚学的一句新命令&#xff0c;才用完就忘了用法&#xff1f;通常情况下&#xff0c;命令后加一句—help就行了。但是&#xff0c;命令的帮助文档往往内容太太太太多了&#xff0c;在里面找到自己关心的部分实在太难了。查找出来的…

用python绘制图形_使用Python的turtle画炫酷图形

例子一&#xff1a; import turtle t turtle.Pen() turtle.bgcolor("black") sides6 colors["red","yellow","green","blue","orange","purple"] for x in xrang(360): t.pencolor(colors[x%sides]) t…

leetcode初级算法1.删除排序数组中的重复项

leecode初级算法1.删除排序数组中的重复项 仅为个人刷题记录&#xff0c;不提供解题思路 题解与收获 class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n 0) {return 0;}int fast 1, slow 1;while (fast < n) {if (nums[fast] ! num…

(转)mybatis热部署加载*Mapper.xml文件,手动刷新*Mapper.xml文件

转自&#xff1a; https://blog.csdn.net/LOVELONG8808/article/details/78738086 由于项目已经发布到线上&#xff0c;要是修改一个Mapper.xml文件的话&#xff0c;需要重启整个服务&#xff0c;这个是很耗时间的&#xff0c;而且在一段时间内导致服务不可用&#xff0c;严重…

图解HashMap和HashSet的内部工作机制

转载自 图解HashMap和HashSet的内部工作机制HashMap 和 HashSet 内部是如何工作的&#xff1f;散列函数&#xff08;hashing function&#xff09;是什么&#xff1f; HashMap 不仅是一个常用的数据结构&#xff0c;在面试中也是热门话题。 Q1. HashMap 如何存储数据&#xff1…

window location href 手机端无法跳转_Window对象在前端领域的角色

特殊的window提起window&#xff0c;在网页当中很常见&#xff0c;比如像这样&#xff1a;window.onloadfunction(){ //执行函数体 }这段代码的意思是当网页内容加载完成后要做什么。在js的领域&#xff0c;window对象有着双重角色&#xff0c;既是用来访问浏览器窗口的接口&am…