mysql“数据不存在插入,存在则更新”实现

news2024/12/23 9:05:28

参考文章:Mysql:如果数据存在则更新,不存在则插入

场景

工作中有遇到需要配置一些指定的字段数据,但数据量大,不清楚之前是否有配置过,正确的思路应该是如果有这条数据了,那么更新数据的值,如果没有这条数据,那么应该插入一条数据。
比如需要根据不同国家进行不同功能的开启或者关闭,表结构如下:

CREATE TABLE `region_config_info` (
  `id` varchar(64) NOT NULL,
  `create_time` bigint(20) DEFAULT NULL COMMENT '创建时间',
  `func_desc` varchar(128) DEFAULT NULL COMMENT '功能说明',
  `func_enable` bit(1) DEFAULT b'0' COMMENT '0-未开启,1-已开启',
  `func_type` int(4) NOT NULL COMMENT '功能类型',
  `region_code` varchar(8) NOT NULL COMMENT '国家的alpha2码',
  `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `region_config_info_region_code_IDX` (`region_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

插入三条数据:

INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '是否支持二维码分享', b'0', 0, 'FR', current_timestamp());

INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '免费抽奖活动', b'0', 1, 'FR', current_timestamp());

INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '打折活动', b'1', 2, 'FR', current_timestamp());

插入后,表数据如图所示:
在这里插入图片描述

更新/插入数据

知道唯一索引的值

mysql语法支持数据存在更新,不存在插入。判断的依据是唯一索引的字段是否存在,对于本文中的例子就是主键id。
如果已知主键id,那么可以使用DUPLICATE、REPLACE INTO方式处理数据

DUPLICATE

语法

INSERT INTO 表名(唯一索引列,2,3) VALUE(1,2,3) ON DUPLICATE KEY UPDATE=,=

测试的sql如下:

  • 对于aa4b49ff-661b-11ed-ae64-6c4b90aa5ada这条数据,如果没有则插入,如果有,则更新func_enable为关闭且更新update_time。
INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time) 
VALUE("aa4b49ff-661b-11ed-ae64-6c4b90aa5ada", current_timestamp(), '打折活动', b'0', 2, 'FR', current_timestamp()) 
ON DUPLICATE KEY UPDATE func_enable= b'0',update_time=current_timestamp()

执行结果如下:结果为有本条数据,因此更新了func_enable和update_time
在这里插入图片描述

  • 对于1这条数据,如果没有则插入,如果有,则更新
INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time) 
VALUE("1", current_timestamp(), '打折活动', b'1', 2, 'CN', current_timestamp()) 
ON DUPLICATE KEY UPDATE func_enable= b'1',update_time=current_timestamp()

执行结果如下:结果为新插入一条id为1的数据
在这里插入图片描述

REPLACE INTO

语法

REPLACE INTO 表名称(1,2,3) VALUES(1,2,3)

测试的sql如下:

  • 对于1这条数据,如果没有则插入,如果有,则更新。
REPLACE INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)  
VALUES("1", current_timestamp(), '打折活动', b'1', 2, 'IN', current_timestamp()) 

执行结果如下:结果为有本条数据,数据都按照新的数值插入的,create_time和update_time都更新了
在这里插入图片描述

测试的sql如下:

  • 对于2这条数据,如果没有则插入,如果有,则更新。
REPLACE INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)  
VALUES("2", current_timestamp(), '免费抽奖活动', b'1', 1, 'IN', current_timestamp()) 

执行结果如下:结果为无本条数据,插入一条id为2的数据
在这里插入图片描述

并不知道唯一索引的值,只想插入/更新符合某些条件的数据

如果不知道主键id的情况下,根据部分条件查找进行插入或更新数据,比如:配置国家IN的“是否支持二维码分享”活动为开启,但并不知道这条数据在或者不在,也不知道主键id的情况,该如何处理呢?

插入语句

INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)  
SELECT UUID(), current_timestamp(), '是否支持二维码分享', b'1', 0, 'IN', current_timestamp()
from DUAL  
where not exists(select id from region_config_info where region_code = 'IN' and func_type = 0); 

执行结果:不存在region_code为IN且func_type是0的数据,因此插入了这条数据。可以多次运行这条数据,并没有新插入数据,且原来数据的create_time、update_time都没有更新。
如图:
在这里插入图片描述

更新语句

update region_config_info c set c.func_enable = 1, c.update_time = current_timestamp()
where id in 
(select a.id from
(select * from region_config_info where func_type = 0 and region_code in ('IN','FR') and func_enable != 1) as a)

执行结果:更新了FR国家的func_type=0的开启状态,IN的由于已经是1了,所以无需更新,可以看到结果中的update_time是有改变的。此语句可以批量更新一些指定条件的数据。
如图:
在这里插入图片描述

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

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

相关文章

股票行情接口level2的盘口信息和level1有哪些区别?

普通的行情接口软件会有价格曲线、五档盘口、分时成交等等这些行情数据,但是股票行情接口level2所能够提供的行情数据远远不止这些,level2顾名思义其实就是level1的高配版,那么它包含的数据相对于比普通行情接口的会更精细也更丰富&#xff0…

华为 x 香格里拉集团|品质网络守护数字旅程

作者 | 曾响铃 文 | 响铃说 酒店行业正在快速推动数字化,其目标是对内提升酒店管理效率,对外提升宾客入住体验;而网络作为整个数字化变革的联接底座,迫切需要进行升级和优化。以香格里拉集团为例,作为成立超过半个世…

微信怎么使用手机号码收款转账?

微信怎么使用手机号码收款? 1、微信手机号码收款方,打开微信钱包,并点击钱包进入; 2、在微信钱包找到支付设置,并点击进入支付设置; 3、在微信钱包支付设置内,开启允许通过手机号向我转账&…

力荐,京东首席架构师:亿级流量架构的核心技术文档免费分享

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候…

大厂敲门砖,在阿里工作十年的朋友,总结出这份java面试必看手册

眼看着时间一天一天地过去,距离过年也就二个月的日子了,还有多少程序员是两眼摸黑不知道面试要做哪些准备的朋友? 还不知道进大厂需要复习哪些资料的朋友可以看过来,知道有些朋友会没什么准备跟无头苍蝇一样所以博主早在一个月前…

[附源码]计算机毕业设计JAVA镐京学院教务管理系统

[附源码]计算机毕业设计JAVA镐京学院教务管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

Python文件操作

文章目录文件操作打开文件关闭文件读文件写文件使用上下文管理器文件操作 打开文件 open函数 open函数的作用是打开一个文件,并返回打开的文件对象。该函数的常见调用方式如下: f open(file, mode, encoding)参数说明: file:待…

如何实现基于场景的接口自动化测试用例?

自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。 基于这个想法,我们的接口自动化测试思路如下…

Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、需求描述 大头贴App有两个特征,第一个是头要大,拿来一张照片后把人像区域裁剪出来,这样新图片里的人头才会比较大,第二个是在周围贴上装饰物,而且装饰物还能随时更…

【Spring】——7、@Import注解给容器中快速导入一个组件

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

Ubuntu下关于cuda和cudnn 报错 现象及解决方案

详细流程:1、现象2、探索(可跳过)3、完美解决(真实原因)3.1 查看当前cuda版本3.2电脑有多个cuda版本,通过改变软链接改变指向3.3 写入系统环境:1、现象 啊这,重启丢失了个啥触摸的驱动&#xff…

Java并发 - (并发基础)

Java并发 - (并发基础) 1、什么是共享资源 堆是被所有线程共享的一块内存区域。在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例 Java中几乎所有的对象实例都在这里分配内存。方法区与堆一样,也是各个线程共享的一块内存区域,它用于存储已被…

Linux实用操作-----快捷键的使用(收藏系列)

推荐教程:Linux零基础快速入门到精通 ctrl c 强制停止 •Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c •命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重新输入 ctrl d 退出…

注意论文投稿风险,现投期刊会不会成为预警期刊呢?

中科院发布《国际预警期刊名单》 2021年12月31日,中国科学院文献情报中心期刊分区表团队发布《国际期刊预警名单(试行)》,用以提醒科研人员审慎选择成果发表平台,提示出版机构强化期刊质量管理。截至目前,…

Vue 实现拖拽模块(二)自定义拖拽组件位置

上文介绍了 拖拽添加组件 的简单实现,本文将继续给大家分享如何自定义拖拽组件位置的简单实现,文中通过示例代码介绍,感兴趣的小伙伴们可以了解一下 本文主要介绍了 Vue自定义拖拽组件位置的简单实现,具体如下: 效果图…

高空抛物检测方案设计(使用SOM进行轨迹分类)

文章目录前言一、技术方案介绍1.方案设计图2.流程介绍3.说明二、实际检测1.摄像头的安装2.实际检测三、误报解决误报事件1:飞鸟误报事件2:树叶误报事件3:被子解决方案轨迹展示原始轨迹SOM分类结果总结前言 高空抛物检测的关键是方案的设计&a…

MATLAB 绘图合集:分类散点图gscatter

本文主要介绍如何依据数据类别同时呈现数据散点图。 目录 说明 例子 使用默认设置绘图 使用数据类别来画图 使用多组数据类别来画图 创建并调整散点图 说明 gscatter(x,y,g) 创建 和 的散点图x,y按 分组g。输入x和 y是相同大小的向量。 例子 gscatter(x,y,g,c…

Jekyll 语句语法、功能的实现方法和结构介绍小手册

本文很长,建议使用侧边栏进行跳转。 本文虽然按照由浅入深的顺序介绍了 Jekyll 的语句语法和功能结构,但是主要用于快速查询一些 Jekyll 语句、功能的实现方法和结构介绍。 如果你想: 了解查看一些常用的 Jekyll 的相关命令和选项还请查看&…

第六章第一节:图的基本概念和存储及基本操作

文章目录1. 图的基本概念1.1 图逻辑结构的应用1.2 无向图,有向图1.3 简单图,多重图1.4 顶点的度,入度和出度1.5 顶点和顶点的关系描述1.6 连通图,强连通图1.7 研究图的局部——子图1.8 生成树1.9 生成森林1.10 边的权,…

手机怎么实现图片转文字操作?学会这三招就够了

随着互联网不断发展,我们手机的功能越来越丰富,现在基本上只需要一部手机,就能满足我们的多样化需求。比如想要提取书本中的文字,我们不需要再手动输入,只要将文字内容拍照下来,利用一些软件来提取图片中的…