mysql duplicate key与replace into对比

【REDME】

有些业务场景如下:

对于数据已经存在的,则更新;否则新增;

怎么判定数据已经存在,通过主键或唯一索引来判断

业务场景:业务库的全局参数表的参数值的新增或更新就是 有则更细无则插入的常见业务场景


【1】2种实现方式

通常情况下,我们是先select,判断数据是否存在;若不存在,则新增,否则更新;

要完成这个小小功能,我们需要写3条sql,非常麻烦;

采用2种简单方式(只需要写1条sql):

  • 方式1, duplicate key, insert into ...... on duplicate key update ...
  • 方式2,replace into,


【1.1】duplicate key update

0. duplicate 官方文档翻译,参见   https://blog.csdn.net/PacosonSWJTU/article/details/120058725

1.duplicate顾名思义,有重复键则更新,否则插入

2.语法如下:

如果指定 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;

3.测试案例

-- 表结构
CREATE TABLE `my_cust_warn_tbl` (`rcrd_id` varchar(64) NOT NULL COMMENT '记录编号',`cust_num` varchar(50) NOT NULL COMMENT '客户号',`cust_name` varchar(50) DEFAULT '' COMMENT '客户姓名',`warn_times` int(11) DEFAULT NULL COMMENT '客户预警次数',`create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`last_modify_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '最后修改时间',PRIMARY KEY (`rcrd_id`),UNIQUE KEY `uni_cust_num` (`cust_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户预警表'

注意: 使用duplicate语法的数据库表一定要设置唯一索引,以便于判断数据是否存在;

统计客户的预警次数,很显然就是有着更新,没有则新增;

INSERT INTO  
mybatis.my_cust_warn_tbl (rcrd_id, cust_num, cust_name, warn_times)
VALUES('hand_11', 'hand_11_custnum', 'hand_11_custname', 0)
on duplicate key update warn_times=warn_times+1, create_time = current_timestamp
;

第一次执行上述sql,由于 hand_11_cust 不存在,则返回条数是1;

 第二次执行SQL如下 (注意,第一次与第二次的sql不一样,主键不同,但客户号相同,客户号是唯一索引)

INSERT INTO  
mybatis.my_cust_warn_tbl (rcrd_id, cust_num, cust_name, warn_times)
VALUES('hand_11_2', 'hand_11_custnum', 'hand_11_custname', 0)
on duplicate key update warn_times=warn_times+1, create_time = current_timestamp
;

由于 hand_11_cust 已经存在,更新条数返回2;


【1.2】replace into

1.replace顾名思义,替换,有则先删除,后插入;没有则直接插入;

步骤为:

  • step1)delete 存在的记录(通过主键或唯一索引来判断);
  • step2)重新插入新值;

为了演示效果,我们新建了一个主键自增的数据库表;

drop table if exists my_cust_warn_autopk_tbl
; 
CREATE TABLE `my_cust_warn_autopk_tbl` (`rcrd_id` int primary key not null auto_increment COMMENT '记录编号',`cust_num` varchar(50) NOT NULL COMMENT '客户号',`cust_name` varchar(50) DEFAULT '' COMMENT '客户姓名',`warn_times` int(11) DEFAULT NULL COMMENT '客户预警次数',`create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`last_modify_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '最后修改时间',UNIQUE KEY `uni_cust_num` (`cust_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户预警表(自增)'
;

2. 测试案例

REPLACE INTO  
mybatis.my_cust_warn_autopk_tbl (cust_num, cust_name, warn_times)
VALUES('hand_12_custnum', 'hand_12_custname', 0)
; 

因为之前没有存在的数据,故更新行数为1;

 刚刚插入的记录的主键值为1 ; 如下;

 接着, 我们把客户姓名字段设置为null看下; 发现更新行数为2

REPLACE INTO  
mybatis.my_cust_warn_autopk_tbl (cust_num, cust_name, warn_times)
VALUES('hand_12_custnum', null, 0)
;  

我们看下数据长什么样子:仅有一个 主键值为2的记录存在

很显然,因为存在客户号为 hand_12_custnum的记录,于是先删除了 主键为1的记录,然后再插入主键为2的记录,如下:

 当然了,通过两次sql的 create_time 也可以判断出 第2次replace是 删除旧记录,然后重新新增一条数据,而不是在旧记录上修改; 因为 两次的create_time 不一样


【2】 两者执行时间简单对比

show variables like "%pro%";
set profiling=1;
show profiles ; 

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

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

相关文章

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

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

Java 8 HashMap键与Comparable接口

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

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

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

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

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

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

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

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

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

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

例子一: 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…

leetcode初级算法2.旋转数组

leecode初级算法2.旋转数组 仅为个人刷题记录&#xff0c;不提供解题思路 题解与收获 我自己的解法&#xff1a; public static void rotate(int[] nums, int k) {int move k % nums.length;Stack<Integer> stack new Stack<>();if(move 0){return;}else {f…

java运行环境变量及自定义变量

【README】 本文主要介绍java运行环境变量的获取&#xff0c;如何读取 env.properties 文件并将自定义变量写入到系统变量&#xff1b; 【1】System.getenv() 获取环境变量 public static void main1() {Map<String, String> envMap System.getenv();envMap.entrySet(…

Java HashSet和HashMap源码剖析

转载自 Java HashSet和HashMap源码剖析总体介绍 之所以把HashSet和HashMap放在一起讲解&#xff0c;是因为二者在Java里有着相同的实现&#xff0c;前者仅仅是对后者做了一层包装&#xff0c;也就是说HashSet里面有一个HashMap&#xff08;适配器模式&#xff09;。因此本文将重…

怎么把页面按比例缩小_meta viewport 是做什么用的,怎么写?

前置知识&#xff08;有助于viewport的理解&#xff09;李明&#xff1a;设备像素、设备独立像素、CSS像素、分辨率、PPI、devicePixelRatio​zhuanlan.zhihu.com移动端的问题屏幕窄&#xff0c;一般来说设备独立像素不超过400px。比如把网站侧边栏宽度设置为10%&#xff0c;这…

(转)java动态代理与aop

转自&#xff1a; Java 动态代理与AOP - 如果的事 - 博客园动态代理与AOP 代理模式 代理模式给某一个目标对象(target)提供代理对象(proxy)&#xff0c;并由代理对象控制对target对象的引用。 模式图&#xff1a; 代理模式中的角色有&#xff1a; 抽象对象角色(Abstrachttps://…

ConcurrentHashMap的红黑树实现分析

转载自 ConcurrentHashMap的红黑树实现分析红黑树 红黑树是一种特殊的二叉树&#xff0c;主要用它存储有序的数据&#xff0c;提供高效的数据检索&#xff0c;时间复杂度为O(lgn)&#xff0c;每个节点都有一个标识位表示颜色&#xff0c;红色或黑色&#xff0c;有如下5种特性&a…

leetcode初级算法3.存在重复元素

leetcode初级算法3.存在重复元素 仅为个人刷题记录&#xff0c;不提供解题思路 题解与收获 我的解法&#xff1a; Arrays.sort(nums);for(int i 0; i < nums.length-1; i){if(nums[i] nums[i1]){return true;}}return false;官方题解&#xff1a; public boolean con…

sql server累计求和函数_SQL基础--SQL高级功能

一.窗口函数有什么用&#xff1f;在日常工作中&#xff0c;经常会遇到需要在每组内排名&#xff0c;比如下面的业务需求&#xff1a;排名问题&#xff1a;每个部门按业绩来排名topN问题&#xff1a;找出每个部门排名前N的员工进行奖励面对这类需求&#xff0c;就需要使用sql的高…

(转)【SpringMvc】如何使用form发送PUT和DELETE请求

转自&#xff1a; https://blog.csdn.net/cockroach02/article/details/82194126https://blog.csdn.net/cockroach02/article/details/82194126 一、当前现状 浏览器使用form提交信息的时候只支持GET和POST&#xff0c;如果需要在浏览器上使用PUT和DELETE请求方式的话&#…