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 ...
随机推荐
- Python字典推导式
要求打印字典中值小于1的key和value d = {"a": 1, "b":2, "c":3} d = {key: value for k ...
- 使用ssh 通过ProxyCommand:利用跳板机让不在同一局域网的机器ssh直连
打开~/.ssh/config文件,如果没有则新建一个 输入以下内容并保存: Host dxx.sxx-bastion # jumpserver name hostname 54.65.xx.2xx ...
- 『玩转Streamlit』--图像与媒体组件
Streamlit中的图像与媒体组件,主要是st.image.st.audio和st.video. 它们是专为在Streamlit Web应用程序中嵌入和展示多媒体内容而设计的,这些组件不仅丰富了应用 ...
- OSPF协议
OSPF(Open Shortest Path First)开放式最短路径优先,是一种链路状态型路由协议,用于在网络中计算最短路径.OSPF协议是基于Dijkstra算法的,使用链路状态信息来计算最短 ...
- java内存区域——daicy
Java虚拟机 运行时数据区 主要分为五部分:方法区,堆(这两块是所有线程共享的区域),程序计数器,本地方法栈,虚拟机栈(vm stack)(这三块为线程隔离区域) 程序计数器(Program Cou ...
- ZSTU2023校赛
篠塚真佑実的树 给定\(n\)个节点的树,其中\(m\)个节点存在传送门,当飞船经过存在传送门的节点的时候,可以选择无消耗地传送至其他存在传送门的节点,现在有\(q\)次询问,每次询问给出起点\(st ...
- kettle 使用 CARTE 执行
在执行KETTLE 任务的时候,可以使用本地执行,或者使用carte server执行. 1.启动carte server .\Carte.bat localhost 8080 2.配置子服务器 这里 ...
- WxPython跨平台开发框架之用户选择和标签组件的设计
在系统的权限管理中,往往都会涉及到用户的选择处理,特别是基于角色的访问控制中,很多情况下需要用到选择用户的处理.本篇随笔,基于WxPython跨平台开发框架,采用原有开发框架成熟的一套权限系统理念,对 ...
- controller返回路径问题
项目打包后,报错template might not exist or might not be accessible by any of the configured Template Resolv ...
- uniapp多次触发跳转问题
问题描述:快速点击跳转页面后会闪退到登陆页面 解决方案:重新封装uniapp跳转api,加防抖锁,To.ts import { NavigateToOptions, RedirectToOptions ...