mysql实现存在则保存,不存在则更新

news/2024/7/24 3:29:32 标签: mysql, 数据库, java

方式1 ON DUPLICATE KEY UPDATE

使用前提:表必须配置唯一键或者主键,且保存的字段中包含该键【重点】
原理:

  1. ON DUPLICATE KEY UPDATE如果配合主键,存在数据a,新插入b,如果主键不冲突,会保存b。如果b主键和a冲突会删除b,然后更新a。
  2. ON DUPLICATE KEY UPDATE如果配合唯一键,mysql先插入一条数据,然后根据唯一键判断唯一键是否冲突,如果已经存在该键,就会删除后面插入的数据,对前面的那条数据执行更新操作。比如已经存在A,此时插入一条B,B和A冲突就会删除B,对A执行后面的更新操作。所以造成主键id+1。

基本语法

插入的字段必须包含master_id, award_name,这两个字段,否则唯一索引无效,mysql无法发现索引冲突,会一直执行保存动作,不会执行更新。
单条插入或者更新

INSERT INTO reward_center_award  (master_id, award_name) VALUES('432564','京东e卡')
ON DUPLICATE KEY UPDATE 
award_name='杜卡迪一辆'

批量插入或者更新

INSERT INTO reward_center_award  (master_id, award_name,award_type) VALUES('432564','京东e卡',4), ('432564','杜卡迪',1),('432564','春风450',2)

ON DUPLICATE KEY UPDATE 
award_name='杜卡迪一辆'

初始化表

主键id,唯一索引由master_id,award_name组成,意思同一个品牌商的奖品名称是唯一的。

DROP TABLE IF EXISTS reward_center_award;
CREATE TABLE `reward_center_award` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否删除(0:删除,1可用)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `reward_guid` varchar(50) DEFAULT NULL COMMENT '奖励标识guid',
  `master_id` varchar(50) DEFAULT NULL COMMENT '品牌主Id',
  `master_name` varchar(50) DEFAULT NULL COMMENT '品牌主名称',
  `award_name` varchar(50) DEFAULT NULL COMMENT '奖品名称',
  `award_type` tinyint(4) DEFAULT NULL COMMENT '奖励类型 1:店铺商品,2:线下商品,3:积分,4:优惠券',
  `goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
  `goods_price` decimal(13,2) DEFAULT NULL COMMENT '商品价格',
  `number` bigint(11) DEFAULT '0' COMMENT '奖品总数',
  PRIMARY KEY (`id`),
  UNIQUE KEY `master_id_award_name` (`master_id`,`award_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='奖品中心奖品表';

1. 表一开始为空,所以这里是保存一条数据。

INSERT INTO reward_center_award  (master_id, award_name) VALUES('432564','京东e卡')
ON DUPLICATE KEY UPDATE 
award_name='杜卡迪一辆'

在这里插入图片描述
执行结果
在这里插入图片描述
2. 同样的语句再执行一次
因为前面插入了一条数据a,这次又插入一条一样的数据b,这次会唯一索引冲突,会删除b,然后对a执行更新操作,主键id+1

INSERT INTO reward_center_award  (master_id, award_name) VALUES('432564','京东e卡')
ON DUPLICATE KEY UPDATE 
award_name='杜卡迪一辆'

在这里插入图片描述
在这里插入图片描述
3. 再插入一条不同的数据
因为前面主键+1,所以这里id从3开始了

INSERT INTO reward_center_award  (master_id, award_name) VALUES('432564','春风450')
ON DUPLICATE KEY UPDATE 
award_name='杜卡迪一辆'

在这里插入图片描述

方式二:REPLACE INTO

也需要存在主键或者唯一键
先删除原来数据,再插入。比如表里有A,插入一条和A一样的B时,会把A删除再插入B。

基本语法

插入的字段必须包含master_id, award_name,这两个字段,否则唯一索引无效,mysql无法发现索引冲突,会一直执行保存动作,不会执行更新。
单条插入或者更新

REPLACE INTO 表名(字段1,字段2)
VALUES(值A,值B);

批量插入或者更新

REPLACE INTO 表名(字段1,字段2)
VALUES(值A,值B),(值A,值B),(值A,值B),(值A,值B);

和上面同样的表

DROP TABLE IF EXISTS reward_center_award;
CREATE TABLE `reward_center_award` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否删除(0:删除,1可用)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `reward_guid` varchar(50) DEFAULT NULL COMMENT '奖励标识guid',
  `master_id` varchar(50) DEFAULT NULL COMMENT '品牌主Id',
  `master_name` varchar(50) DEFAULT NULL COMMENT '品牌主名称',
  `award_name` varchar(50) DEFAULT NULL COMMENT '奖品名称',
  `award_type` tinyint(4) DEFAULT NULL COMMENT '奖励类型 1:店铺商品,2:线下商品,3:积分,4:优惠券',
  `goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
  `goods_price` decimal(13,2) DEFAULT NULL COMMENT '商品价格',
  `number` bigint(11) DEFAULT '0' COMMENT '奖品总数',
  PRIMARY KEY (`id`),
  UNIQUE KEY `master_id_award_name` (`master_id`,`award_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='奖品中心奖品表';

插入两条数据

INSERT INTO reward_center_award  (master_id, award_name,award_type) VALUES('432564','杜卡迪','1'),('432564','春风450','2');

在这里插入图片描述

REPLACE INTO reward_center_award  (master_id, award_name,award_type) VALUES('432564','杜卡迪',3);

id=1的被删除了,插入了一条新数据
在这里插入图片描述
完结!!!
在这里插入图片描述


http://www.niftyadmin.cn/n/272840.html

相关文章

H7-TOOL的CANFD Trace全解析功能制作完成,历时一个月(2023-04-28)

为了完成这个功能,差不多耗费了一个月时间,精神状态基本已经被磨平了。 当前已经支持: 1、LUA小程序控制,使用灵活。 2、采用SWD接口直接访问目标板芯片的CANFD外设寄存器和CANFD RAM区实现,支持USB,以太网…

vue+element Ui 树型组件tree懒加载+搜索框远程请求数据为平铺类型

本人之前一直是耕耘后台研发,最近接了个小需求需要接触到vue,记录一下我遇到的一些前端解决时间长的问题 需求: 1:每次动态请求接口获取下一节点数据 2:接口返回的数据是list,不带子节点,用pid来…

化工厂5G+北斗RTK室外人员定位系统解决方案

化工厂的安全管理工作非常重要,为了确保员工的安全和提高生产效率,建议引入人员定位技术。下面给大家介绍化工厂5G北斗RTK室外人员定位系统解决方案。关于化工厂室内人员定位方案,可以参考我之前写的文章:化工厂5G蓝牙LoRa室内人员…

【DevOps视频】笔记】1. DevOps的诞生

视频官网 目录 一、DevOps介绍 定义: 作用: 核心: 二、软件开发流程 三、流程图 一、DevOps介绍 定义: Development & Operations的缩写,也就是开发&运维DevOps 是一个不断提高效率并且持续不断工作…

过来人转本考试后的感悟和经验,真的很受用

过来人转本考试后的感悟和经验,真的很受用!转本不仅是分数的较量,也是信息收集、时间管理、学习能力、毅力等等的较量。同学们在转本中难免会遇见一些困难,为了避免走弯路,一起来看看过来人的感悟和经验吧!…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候,需要具备的功能有哪些呢? 一、采集跟踪功能。 (1)、信息采集:信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

PostgreSQL安装和开启SSL加密连接【配置双向认证】

SSL单向认证和双向认证: SSL单向认证:只有一端校验对端的证书合法性,通常都是客户端来校验服务器的合法性。即在一般的单向认证中,只要求服务器端部署了ssl证书就行,客户端可以无证书,任何用户都可以去访问…

服务(第十三篇)lvs(负载均衡器)+nginx(反向代理)+tomcat(后端服务器)+nfs共享

准备6台机器: 192.168.169.10 lvs负载均衡器 192.168.169.20、192.168.169.30 nginx反向代理 192.168.169.40(tomcat多实例)192.168.169.50(tomcat) 19.168.169.60(nfs共享) 实验没啥好说的…