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

方式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的被删除了,插入了一条新数据
在这里插入图片描述
完结!!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式监控平台-Zabbix

分布监控平台-Zabbix 一、Zabbix概述1、Zabbix是什么?2、Zabbix监控原理 二、部署Zabbix服务端(端口:10051)1、关闭防火墙 修改主机名2、获取Zabbix下载资源3、安装SCL(Software Collections),修改 Zabbix-front 前端源…

Analysis For Office的一些使用技巧

目录 1. 自由特性下钻停止刷新 2. 直接双击过滤内容 3.重复层级值 4. 从过滤值选参数 5.从Excel复制参数 6. 保存参数值 7.计划值回退到上一步 8. 保存当前导航步骤 1. 自由特性下钻停止刷新 一般我们每次拖一个自由特性到workbook里,报表都会自动刷新。如…

ARL灯塔(无需VPS版)

标题随便写,能看到都是有缘人 搭建灯塔那么繁琐的步骤,远不如爆破一个灯塔是吧(狗头) 而且还可能买不起VPS的情况(例如我) 那不如写一个脚本去爆破灯塔的弱口令 整治网络安全 从你我做起 fofa语法: icon_hash"1708240621"…

adk部署win10

adksetup.exe安装 百度搜索adk 在这里插入图片描述 https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install下载adk 注意:要和操作系统版本对应上,我这里是1903版本的win10。

探索未来的数字人生:全景VR数字人

在数字化时代,人工智能和虚拟现实技术正日益成为我们生活中不可或缺的一部分。而全景VR数字人,则是这一时代的最新产品,吸引了越来越多的关注和研究。 一、什么是全景VR数字人? 全景VR数字人是一种通过虚拟现实技术创造的数字人形…

中国移动发布COCA软硬一体片上计算架构,引领云计算市场下一个黄金十年

当前,数字经济发展已经成为改变全球竞争格局的关键力量,随着算力成为数字经济新引擎,算力规模持续增长,算力结构发生改变。主动拥抱智算浪潮,持续输出优质算力支撑数字中国建设,适配泛在化、异构化算力推动…

如何理解自动化测试数据驱动与关键字驱动的区别?

一、关键字驱动KDT(Keyword-driven testing) 1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段,它是当前比较流行的一种框架之一,并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保…

在外Windows远程连接MongoDB数据库【无公网IP】

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…

大数据Doris(六):BE部署及启动

文章目录 BE部署及启动 一、上传安装包并解压 二、修改be.conf 配置文件

【Java笔试强训 3】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥最长的…

跳跃游戏 (DFS->记忆化搜索->动态规划/贪心证明)

一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数&#…

[入门必看]数据结构5.2:二叉树的概念

[入门必看]数据结构5.2:二叉树的概念 第五章 树与二叉树5.2 二叉树的概念知识总览5.2.1_1 二叉树的定义和基本术语5.2.1_2 二叉树的性质5.2.2 二叉树的存储结构 5.2.1_1 二叉树的定义和基本术语二叉树的基本概念二叉树的五种状态几个特殊的二叉树满二叉树&#xff1…

Navicat安装教程和评测

Navicat是一款功能强大的数据库管理软件,拥有丰富的功能和易于使用的界面,因此价格相对较高。此外,Navicat还提供了多种数据库类型的支持,包括MySQL、Oracle、PostgreSQL等,每种数据库类型都需要花费开发人员大量的时间…

飞利浦水健康携净水新品重磅亮相AWE2023

2023年度中国家电及消费电子博览会(AWE2023)于4月27日在上海新国际博览中心正式开幕。其中,飞利浦水健康携全屋高阶净水G5系列、厨下净水器U22Pro、冰热矿净四合一台式净饮机等新品悉数亮相,在暌违2年的AWE舞台上,为行…

小程序按钮重复点击解决方案

文章目录 前言一、为什么会发生重复点击二、针对以上问题怎么处理1、分析解决方法:1. 反馈2.禁用 三、最优解决总结 前言 小程序是直面用户便捷的应用,而在用户使用时往往都会涉及到关键节点的按钮点击,例如,注册登录时&#xff…

【技术】《Netty》从零开始学netty源码(四十八)之缓存池ObjectPool

目录 ObjectPool创建对象池获取对象get()从本地池中获取对象claim()回收对象 ObjectPool 在分析PooledByteBuf的时候我们遇到了recycleHandler类,该类用于回收已经使用完毕的缓存对象并将其放回池中供下次循环利用,Netty的对象池工作过程大体如下&#…

vulnhub靶机Misdirection

环境准备 下载链接:https://download.vulnhub.com/misdirection/Misdirection.zip 解压后双击ovf文件导入虚拟机 网络:DHCP、NAT、192.168.100.0/24网段 信息收集 主机发现 192.168.100.133是新增的ip 端口扫描 发现开放了以上端口,继续…

ChatGPT之父:未训练GPT-5

GPT等大型语言模型带动的芯片需求飙升趋势依然没有平息的迹象,英伟达的最新版旗舰AI芯片H100近日在网上的售价已经被炒到4万多美金,反映了科技行业对训练和部署人工智能软件的需求仍未被满足。 一、商业圈 1.马斯克成立新AI公司硬刚OpenAI 当地时间4月…

c++ 11标准模板(STL) std::vector (二)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

如何使用递归函数实现Excel列号转换列标

在Excel中&#xff0c;列标与列号转换是VBA开发过程中经常用到的功能&#xff0c;下面这篇博客为大家解释了多种方法。 【Excel列标与列号转换】 那么这篇博文的核心是“递归过程”&#xff0c;实现这个功能并不是必须使用递归过程&#xff0c;但是这也不失为一种实现方法&am…