MySQL如果数据存在则更新,不存在则插入
如果数据存在则更新,不存在则插入,MySQL有duplicate、replace into、replace三种方式如何更新数据?
insert ignore into 又是如何插入数据的呢?
准备表和基础数据
测试MySQL版本:8.0.35
use testdb;
#drop table tb_student;
CREATE TABLE `tb_student` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '自增',
`num` int not null default 0 COMMENT '',
`name` varchar(30) DEFAULT '' COMMENT 'appid',
`address` varchar(100) default '' COMMENT '家庭地址',
`mobile` varchar(30) DEFAULT '' COMMENT '手机号',
primary key (id),
unique key idx_num(num)
) ENGINE=InnoDB comment ='学生信息';
select * from tb_student;
测试 INSERT INTO ... ON DUPLICATE KEY UPDATE
功能: MySQL语法支持如果数据存在则更新,不存在则插入,首先判断数据存在还是不存在的那个字段要设置成unique索引。
语法: INSERT INTO 表名(唯一索引列, 列2, 列3) VALUE(值1, 值2, 值3) ON DUPLICATE KEY UPDATE 列=值, 列=值
初始化第一条数据
insert into tb_student (num,name,address,mobile)values(1,'张三','上海','18111111111');

不存在则插入
insert into tb_student(num,name,mobile) values(10,'李四','13100000000') on duplicate key update name='李四',mobile='1310000000';

存在则更新
从下面的结果可以看出,第二条记录主键id=2并没有变化,on duyplicate key update 直接在原记录上更新字段值。
insert into tb_student(num,name,mobile) values(10,'李四','13188888888') on duplicate key update name='李四',mobile='13188888888';

INSERT部分,未指明唯一索引列有两种情况:
- 如果表中不存在索引列默认值(这里是int,默认值指定的是0)的记录,则直接插入,索引列为默认值;
- 如果表中存在索引列默认值记录时,则更新索引字段为默认值记录的其他数据。
insert into tb_student(id,name,mobile) values(3,'王五','15611111111') on duplicate key update name='王五',mobile='15611111111';

第二次未指明唯一索引列插入数据,从下面的结果看出,王五的数据被刘麻子的数据更新掉了。
insert into tb_student(id,name,mobile) values(4,'刘麻子','15899999999') on duplicate key update name='刘麻子',mobile='15899999999';
on duplicate key update特点
- DUPLICATE不会删除原有的记录。即:不会破坏索引。
- 不指定唯一索引列时,直接将数据插入表中,索引列是默认值,如果表中已经存在索引列默认值时,就将索引列为默认值的数据更新掉。
测试 REPLACE INTO
REPLACE INTO 主要作用类似 INSERT 插入操作。主要的区别是 REPLACE INTO 会根据主键或者唯一索引检查数据是否存在,如果存在就先删除再更新。
- 语法:REPLACE INTO 表名称(列1, 列2, 列3) VALUES(值1, 值2, 值3)
不存在则插入
replace into tb_student(num, name, mobile) VALUES(30, '刘备', '13122222222');

注意:此时的主键id=4
存在则先删除后插入
注意:从下面的结果上看,此时的主键id=4的一条记录被删除,重新插入了一条主键id=5的新记录。
replace into tb_student(num, name, mobile) VALUES(30, '刘备', '13122222222');

REPLACE INTO 特点
REPLACE INTO底层是先删除后插入数据,会破坏索引、重新维护索引。
必须要有主键或唯一索引才能有效,否则replace into就只新增了。
测试REPLACE
replace是mysql 里面处理字符串比较常用的函数,可以替换字符串中的内容。类似的处理字符串的还有trim截取操作。
- 语法:replace(object,search,replace)
查询结果替换
select replace('aaabbbcccc','b','d');

更新数据
update tb_student set address=replace(address,'上','青') where id=1;

测试insert ignore into
如果插入的数据在表中已经存在(主键或者唯一键已存在),使用insert ignore 语法可以忽略插入重复的数据。
- 语法:insert ignore into table_name values…
主键不冲突,直接插入
insert ignore into tb_student(id, num,name, mobile) VALUES(6, 40,'张飞', '13144444444');

主键冲突,忽略插入
insert ignore into tb_student(id, num,name, mobile) VALUES(6, 40,'赵云', '13155555555');

去掉ignore,SQL报异常
insert into tb_student(id, num,name, mobile) VALUES(6, 40,'赵云', '13155555555');

插入语句不指定索引列时的两种情况
- 如果表中不存在索引列默认值(这里是int,默认值指定的是0)的记录,则直接插入,索引列为默认值;
- 如果表中存在索引列默认值记录时,则插入不成功,因为和默认值的唯一索引冲突了。

总结:
on duplicate key update特点
- DUPLICATE不会删除原有的记录。即:不会破坏索引。
- 不指定唯一索引列时,直接将数据插入表中,索引列是默认值,如果表中已经存在索引列默认值时,就将索引列为默认值的数据更新掉。
replace into特点
- REPLACE INTO底层是先删除后插入数据,会破坏索引、重新维护索引。
- 必须要有主键或唯一索引才能有效,否则replace into就只新增了。
replace特点
- replace是MySQL里面处理字符串比较常用的函数,可以替换字符串中的内容。
insert ignore into特点
- 主键冲突时,忽略本次插入的数据,否则正常插入。
MySQL如果数据存在则更新,不存在则插入的更多相关文章
- MYSQL查看数据表最后更新时间
MYSQL查看数据表最后更新时间 - 拨云见日 - CSDN博客 https://blog.csdn.net/warnerwu/article/details/73352774 mysql> S ...
- sql mysql和sqlserver存在就更新,不存在就插入的写法(转)
转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9 sqlsever数据存在就更新,不存在就插入的两种方法 两种经常使用的方法: ...
- MySQL 误删数据、误更新数据(update,delete忘加where条件)
MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...
- Mysql:如果数据存在则更新,不存在则插入
mysql语法支持如果数据存在则更新,不存在则插入,首先判断数据存在还是不存在的那个字段要设置成unique索引, 例如表tb_addrbook如下: 索引: 语句1:不存在插入 INSERT INT ...
- MySQL:数据存在则更新,不存在则插入
前提:表结构存在主键或唯一索引,插入数据包含主键或唯一索引而导致记录重复插入失败. 单条记录更新插入: ,,) ,b,c; 多条记录批量更新插入: ,,),(,,) ON DUPLICATE KEY ...
- C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高. 包装了一个简单的sql ...
- mysql如果数据不存在,则插入新数据,否则更新的实现方法
mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...
- mysql根据查询结果批量更新多条数据(插入或更新)
mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...
- MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...
- MySQL load数据的时候自动更新时间
MySQL load数据的时候自动更新时间 前提 CREATE TABLE table_name ( dt varchar(255) NULL , ctime timestamp NULL ON UP ...
随机推荐
- GoLang协程Goroutiney原理与GMP模型详解
本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程,也成为协程,由Go运行时管理.它是Go语言并发编程的核 ...
- 题解:P6672 [清华集训2016] 你的生命已如风中残烛
题解:P6672 [清华集训2016] 你的生命已如风中残烛 标签 组合数学 分析 首先引入一个引理. Raney 引理 对于一个长度为 \(n\) 的序列 \(a\),如果 \(\sum\limit ...
- golang之函数工具库lancet
lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 简体中文 | English 特性 全面.高 ...
- 超详细!SED流编辑器从入门到精通
在文本处理的世界里,SED流编辑器宛如一把瑞士军刀,功能强大且实用.无论是处理海量数据文件,还是批量修改配置文件,SED都能展现出其独特的魅力.今天,就让我们一同深入探索SED的奇妙世界,掌握其基础知 ...
- arcpy获取polygon内环
当使用arcpy获取polygon几何的时候,不能像ao一样获取到内外环,只能获取到单个部件.而part返回的即是一个点组了. 所以只能通过None对象进行分割,确定部件内的内外环.一个part内,只 ...
- ARCGIS 拓扑检查步骤与修正拓扑错误技巧
转自http://xygszsh.blog.163.com/blog/static/19221517201111831348533/,写得没有说多好,贵在详细. 将数据装载如个人地理数据库,用拓扑功能 ...
- ServiceMesh 5:异常重试和超时保护提升服务可用性
★ ServiceMesh系列 1 背景 在复杂的互联网场景中,不可避免的会出现请求失败或者超时的情况. 从程序的的响应结果来看,一般是Response返回5xx状态的错误:从用户的角度去看,一般是请 ...
- 服务拆分之《Dubbo服务跨云通信》
2022年10月开始,公司从阿里请来的架构师将全力推进服务拆分这个计划.实际上这个计划早就提上日程了,只是没有一个带头大哥带着把这个事情搞起来,因为这个系统太庞大了,还非常的复杂,当时就没有哪一个人是 ...
- 小程序 + node koa2 session存储验证码碰到最大的坑,(喜极而泣 /狗头)
问题:session存验证码.本地拿postman测试了半天,都没有问题. 但到了小程序,服务端再获取(ctx.session.verifyCode)就一直提示不存在.undefined 小程序会 ...
- [solon]Solon开发实战之权限认证
本项目采用权限认证框架sa-token(sa-token-solon-plugin) pom.xml <!-- 鉴权--> <dependency> <groupId&g ...