Mysql replace into与on duplicate key update区别

news2024/11/15 11:04:45

1、replace into

REPLACE INTO 首先判断数据是否存在;如果不存在,则插入;如果已存在则更新(先删除再插入

  • 根据主键或唯一索引判断记录是否已存在,所以插入数据的表必须要有主键或者唯一索引!否则的话,REPLACE INTO 会直接插入数据(相当于INSERT),会导致表中出现重复数据。
  • 如果不写某个字段的值则会使用默认值,如果该字段没有定义默认值则报错。
  • 要使用REPLACE INTO,必须同时拥有表的INSERT和 DELETE权限。
MySQL replace into 有三种形式
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...

1.1、主键自增 

alter table t_user change id id int(11) not null AUTO_INCREMENT; 

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(40) NOT NULL,
  `password` varchar(40) NOT NULL,
  `sex` varchar(4) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `save_unique_index` (`username`,`password`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

1.2、replace into tbl_name(col_name, ...) values(...)

1. replace into tbl_name(col_name, ...) values(...)
-- 修改前的数据
1  Tom  123  男
2  Tom  1234  男
3  Jerry  234  女
4  Tom  12345  男
 
replace into t_user(username,password) values('Tom','123');
-- 报错,Field 'sex' doesn't have a default value
 
replace into t_user(username,password,sex) values('Tom','123','男');
-- 受影响的行: 2 ,先删除,再插入
-- 修改后的数据
2  Tom  1234  男
3  Jerry  234  女
4  Tom  12345  男
5  Tom  123  男
 
replace into t_user(username,password,sex) values('Tom','123','女');  
-- 受影响的行: 2
-- 修改后的数据
2  Tom  1234  男
3  Jerry  234  女
4  Tom  12345  男
6  Tom  123  女
 
replace into t_user(username,password,sex) values('Tom','123456','男'); 
-- 受影响的行: 1
-- 修改后的数据
2  Tom  1234  男
3  Jerry  234  女
4  Tom  12345  男
6  Tom  123  女
7  Tom  123456  男

1.3、replace into tbl_name(col_name, ...) select ...

CREATE TABLE `t_user2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `pwd` varchar(40) NOT NULL,
  `sex` varchar(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
 
t_user:
2  Tom  1234  男
3  Jerry  234  女
4  Tom  12345  男
6  Tom  123  女
7  Tom  123456  男
 
t_user2:
1  Tom  123  男
2  Tonny  123  女
3  Jerry  234  女
replace into t_user(username,password,sex) select  name,pwd,sex from t_user2 ; 
-- 受影响的行: 5
-- 修改后,(t_user)6删除,(t_user)8添加,(t_user)9添加,(t_user)3删除,(t_user)10添加 
-- (唯一索引,所以‘Tom  123  女’会删除,再插入‘Tom  123  男’)
t_user:
2  Tom  1234  男
4  Tom  12345  男
7  Tom  123456  男
8  Tom  123  男
9  Tonny  123  女
10  Jerry  234  女

1.4、replace into tbl_name set col_name=value, ...

replace into  t_user set username = 'Tommy' ; 
-- Field 'password' doesn't have a default value

replace into  t_user set username = 'Tommy'  ,password = '1234567';  
-- Field 'sex' doesn't have a default value

replace into  t_user set username = 'Tommy'  ,password = '1234567',sex = '男';  
-- 受影响的行: 1
-- 修改后
2  Tom  1234  男
4  Tom  12345  男
7  Tom  123456  男
8  Tom  123  男
9  Tonny  123  女
10  Jerry  234  女
11  Tommy  1234567  男  -- 这一行是新加的
 
replace into  t_user set username = 'Tommy'  ,password = '1234567',sex = '女';  
-- 受影响的行: 2
-- 修改后
2  Tom  1234  男
4  Tom  12345  男
7  Tom  123456  男
8  Tom  123  男
9  Tonny  123  女
10  Jerry  234  女
12  Tommy  1234567  女 
-- 把id=11的记录delete后,再insert id=12的记录

2、on duplicate key update

on duplicate key update 首先判断数据是否存在;如果不存在,则插入;如果已存在则更新

  • on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
  • 记录已存在时,只会更新on duplicate key update之后指定的字段。
  • 如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。

2.1、创建表

alter table test change id id int(11) not null AUTO_INCREMENT; 

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `organ_no` varchar(40) NOT NULL,
  `branch_no` varchar(40) NOT NULL,
  `branch_name` varchar(40) NOT NULL,
  `created_by` varchar(40) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `branch_no_index` (`branch_no`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

主键索引:id

唯一索引: branch_no

1、organ_no, branch_no, branch_name, created_by字段都不相同

2、branch_name, created_by不同

3、唯一索引branch_no不同

4、修改的值包括了唯一索引值branch_no

2.2、执行sql  :organ_no, branch_no, branch_name, created_by字段都不相同

INSERT INTO t_bank_organ_copy1 ( organ_no, branch_no, branch_name, created_by )
VALUES
	( 1, '3', '浙江分行', '3' ) 
	ON DUPLICATE KEY UPDATE
	branch_name = '江苏分行';

因为没有值相同,所以一定添加

2.3、branch_name, created_by与表中数据不同 

INSERT INTO t_bank_organ_copy1 ( organ_no, branch_no, branch_name, created_by )
VALUES
	( 1, '3', '海南分行', '4' ) 
	ON DUPLICATE KEY UPDATE
	branch_name = '江苏分行';

第三条数据从浙江分行改变成了江苏分行

 ON DUPLICATE KEY UPDATE 后的值是要修改的值

而这个会根据唯一索引进行查询,其他普通列不做匹配(主键也是做匹配的)

2.4、唯一索引branch_no不同

 

INSERT INTO t_bank_organ_copy1 ( organ_no, branch_no, branch_name, created_by )
VALUES
	( 1, '4', '江苏分行', '3' ) 
	ON DUPLICATE KEY UPDATE
	branch_name = '海南分行';

除了唯一索引branch_no不同,其他列都相同

执行后数据库增加一条  

2.5、修改的值包括了唯一索引值branch_no

INSERT INTO t_bank_organ_copy1 ( organ_no, branch_no, branch_name, created_by )
VALUES
	( 1, '4', '江苏分行', '3' ) 
	ON DUPLICATE KEY UPDATE
	branch_name = '海南分行',
	branch_no = '8';

 修改branch_no 4为8,并修改branch_name为海南分行

 

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

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

相关文章

Java 实现访问Redis哨兵(六)

目录 一、哨兵和复制 1.1 哨兵(sentinal) 1.Redis哨兵主要功能 2.Redis哨兵的高可用 1.2 Redis复制(Replication) 1.数据复制原理(执行步骤) 1.3 Redis 主从复制、哨兵和集群这三个有什么区别 二、Java访问哨兵实现 一、哨兵和复制 谈到Redis服务器的高可用&#xff0c…

【笔记】I2S协议是什么?

什么是I2S协议 I2S协议的介绍I2S协议有什么 这两天在搞ESP32的btAudio库,接触到了I2S,简单做个笔记。 I2S协议的介绍 I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标…

2.QT窗口部件

类继承关系图 (上面为Base类,下面为Derived类) 窗口与子部件 窗口:没有父部件的部件,称为顶级部件 子部件:非窗口部件 新建空的qmake项目mywidget1 //mywidget1.proQT core gui greaterThan(QT_MAJO…

这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)

目录 写在前面 完整代码 这里必看!! 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习,可以做人工智能,可以爬取各种小网站,但是你不知道,基于C的正则表达式早就能够爬取各种网络数据啦&a…

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题,两个样例都可以通过,但是提交之后最终的通过率只有8.51%???自己搞了半天一直都是这个通过率,然后用网上说的100%通过率的代码也是一样的结果,最后时间到了还是没有拿到满分&am…

这些vue基本语法,你掌握了吗

文章目录 一、 vue 项目重点概念介绍1. 单页面应用程序2. 单文件组件3.数据驱动视图 二、 vue 基本结构1、template2、script3、style 三、 vue 常用指令介绍1、内容渲染指令(1)插值表达式 {{xxx}} —常用方式(2)v-text&#xff0…

session和JWT的应用及区别

文章目录 登录认证(node)一、session1.下载session2.全部配置session3.存储session4.获取session5.销毁session 二、JWT (Json web token)1.JWT 的工作原理2.JWT 的组成3.下载JWT4.生成token5.解密TOken6.配置全局错误中间件 登录认证(node) 一、session 一、在node中使用sess…

还不懂Redis?看完这个故事就明白了!

还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…

全国独家专利药品有哪些品种?全国独家药品产品汇总查阅

独家药品一般是指某一家药企拥有生产和销售某种药品的独家权利,细分有活性成分独家(通用名成分独家)、品种独家(同成分不同剂型)、独家品规,通俗可以分成药品功能独家和产品独家。独家药品经常被人认为是具…

证件拍照扫描——基于C++与深度神经网络实现证件识别扫描并1比1还原证件到A4纸上

前言 数字化时代的到来,越来越多的证件需要进行电子化处理,例如身份证、驾驶证、护照等。在进行电子化处理时,最常见的需求就是将证件照片复制到A4纸上,以便于打印、存档或传输。同时,为了方便信息的录入和管理&#…

一条命令搭建HTTP服务器

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章:【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

word自带公式编辑

快捷键: 公式编辑:alt“” 上标:x^i 空格 下标:x_i 空格 实数R:\doubleR 空格 偏微分算子:“\partial” 极限:“\limit”(按空格后会显示一串很长的式子,再空格就变…

在Linux操作系统上部署wgcloud监控

1.wgcloud监控介绍 1.1 介绍 ​ 这是一款开源的主机监控系统,可以支持主机各种指标监测(cpu使用率,cpu温度,内存使用率,磁盘容量空间,磁盘IO,硬盘SMART健康状态,系统负载&#xff…

starrocks基于prometheus实现监控告警

监控报警 本文介绍如何为 StarRocks 设置监控报警。 StarRocks 提供两种监控报警的方案。企业版用户可以使用内置的 StarRocksManager,其自带的 Agent 从各个 Host 采集监控信息,上报至 Center Service,然后做可视化展示。StarRocksManager …

[陇剑杯 2021]之Misc篇(NSSCTF)刷题记录⑤

NSSCTF-Misc篇-[陇剑杯 2021] 日志分析:[陇剑杯 2021]日志分析(问1)[陇剑杯 2021]日志分析(问2)[陇剑杯 2021]日志分析(问3) 简单日志分析:[陇剑杯 2021]简单日志分析(问1&#xff0…

Python制作一个自动发送弹幕的工具,让你看直播不冷场

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 让我们先看看效果: 名字我就打码了,当然名字不是关键,我直接截图展示算了,GIF的话,太麻烦了。 环境使用: Python 3.8 / 编译器 Pycharm 2021.2版本 / 编辑器…

存在列排斥力的另一例证

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由5张二值化的图片组成,让A中有5个1,B中全是0,排列组合A的所有可能,统计迭代次数的顺序。其中有12组数据 A-B 迭代次数 1 0 1 5*4*2*1…

Inception 深度卷积神经网络(CNN)架构

Inception是一种深度卷积神经网络(CNN)架构,由Google在2014年提出。它是一种基于多尺度卷积的网络结构,旨在解决传统CNN在处理不同大小的输入图像时存在的问题。 Inception的主要特点是使用了多个不同尺度的卷积核来提取不同尺度…

API测试| 了解API接口测试| API接口测试指南(一)

什么是API? API是一个缩写,它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程,协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序:执行特定任务的程序。例程也称为过…

人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测(含数据集和训练代码)

人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测(含数据集和训练代码) 目录 人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测(含数据集和训练代码) 1. 前言 2. 人脸检测和行人检测数据集说明 (1)人脸检测和行人检测数据…