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

这篇具有很好参考价值的文章主要介绍了mysql“数据不存在插入,存在则更新”实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章: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“数据不存在插入,存在则更新”实现

更新/插入数据

知道唯一索引的值

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
mysql“数据不存在插入,存在则更新”实现

  • 对于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的数据
mysql“数据不存在插入,存在则更新”实现

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都更新了
mysql“数据不存在插入,存在则更新”实现

测试的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的数据
mysql“数据不存在插入,存在则更新”实现

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

如果不知道主键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都没有更新。
如图:
mysql“数据不存在插入,存在则更新”实现

更新语句
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是有改变的。此语句可以批量更新一些指定条件的数据。
如图:
mysql“数据不存在插入,存在则更新”实现文章来源地址https://www.toymoban.com/news/detail-459512.html

到了这里,关于mysql“数据不存在插入,存在则更新”实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot Mybatis 不存在插入数据,存在则更新数据

    是不是经常看到代码, 查一下数据库,如果存在数据,就做更新语句调用; 如果不存在,就插入。 今天该篇介绍的 是使用     INSERT INTO        ON DUPLICATE KEY UPDATE        来实现我们上述的场景, 不需要自己再判断来判断去的。 ON DUPLICATE key update 是根据主键索引或者唯一

    2024年02月13日
    浏览(31)
  • JAVA实现存在更新不存在插入与及多余的进行删除(三)

    这个版本,主要是迭代重载了下save方法,不废话,直接上代码: 具体实现类对应的重载方法如下: 然后就是头部加多了 implements ICudDataServiceT, ApplicationContextAware。 通过这个ApplicationContextAware获取到所有bean服务,肤浅地以实体类拼凑一下服务名,找到bean服务就作为这个调用的

    2024年02月13日
    浏览(44)
  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(70)
  • mysql插入数据如果存在则忽略

    经常有一种场景,某类数据只能在一张表中存在一条,我们会创建唯一索引进行约束,但是如果重复插入就报错了,所以开发上一版都会先查一次然后再insert。 mysql有个简单的写法,基于已经创建的索引,如果存在的话,那么就忽略这条记录的插入。 不废话了,上代码吧。

    2023年04月12日
    浏览(33)
  • 使用saveOrUpdateBatch实现批量插入更新数据

    saveOrUpdateBatch 是 Hibernate 中的一个方法,可以用来批量插入或更新数据。这个方法的参数是一个 List,里面可以存储多个实体对象。当 Hibernate 执行这个方法时,会检查每个实体对象是否存在主键,如果存在主键就执行 update 操作,否则执行 insert 操作。 使用 saveOrUpdateBatch 的代

    2024年02月11日
    浏览(65)
  • SQL——插入已经存在的数据

    现在有一套ID为9003的高难度SQL试卷,时长为一个半小时,请你将 2021-01-01 00:00:00 作为发布时间插入到试题信息表examination_info(其表结构如下图),不管该ID试卷是否存在,都要插入成功,请尝试插入它。 Filed Type Null Key Extra Default Comment id int(11) NO PRI auto_increment (NULL) 自增ID e

    2024年02月06日
    浏览(32)
  • 实现一个MYSQL工具类,包含判断创建数据表是否存在,创建数据表

    可以使用Python的MySQLdb模块来实现一个MYSQL工具类。下面是一个简单的实现示例: 使用示例: 在上面的示例中,我们首先创建了一个MySQLTool类,并在初始化方法中传入了数据库的连接信息。然后使用connect方法连接到数据库。 table_exists方法用于判断给定的数据表是否存在,它执

    2024年01月15日
    浏览(61)
  • Java8 实现批量插入和更新,SpringBoot实现批量插入和更新,Mybatis实现批量插入和更新

    基于mybatis实现的批量插入和更新 由于直接执行批量所有数据可能会出现长度超出报错问题,使用如下方式即可解决 原理还是分配执行,这里的100就是设定每次执行最大数 这里使用插入作为例子,也可以使用批量更新 更新的写法

    2024年02月12日
    浏览(52)
  • .NET 数据库大数据操作方案(插入、更新、删除、查询 、插入或更新)

    海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库达到极限性能,当然你如果不用sqlsugar了解一下原理也可以使用其他ORM实现   BulkCopy是一种用于高效批量插入大量数据

    2024年02月08日
    浏览(44)
  • 记录线上一次mysql只能查询,不能插入或更新的bug

    错误复现 突然有一天产品通知xx服务不可用,想着最近也没有服务更新,就先排查一下服务日志 使用postman测试的时候请求明显超时,查看日志显示是一个锁的问题 使用工具连接到mysql,查看information_schema.INNODB_TRX,发现有一个事务处于Running的状态,查看id后不能删除。 查看

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包