如果数据存在则更新,不存在则插入,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部分,未指明唯一索引列有两种情况:

  1. 如果表中不存在索引列默认值(这里是int,默认值指定的是0)的记录,则直接插入,索引列为默认值;
  2. 如果表中存在索引列默认值记录时,则更新索引字段为默认值记录的其他数据。

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');

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

总结:

on duplicate key update特点
  • DUPLICATE不会删除原有的记录。即:不会破坏索引。
  • 不指定唯一索引列时,直接将数据插入表中,索引列是默认值,如果表中已经存在索引列默认值时,就将索引列为默认值的数据更新掉。
replace into特点
  • REPLACE INTO底层是先删除后插入数据,会破坏索引、重新维护索引。
  • 必须要有主键或唯一索引才能有效,否则replace into就只新增了。
replace特点
  • replace是MySQL里面处理字符串比较常用的函数,可以替换字符串中的内容。
insert ignore into特点
  • 主键冲突时,忽略本次插入的数据,否则正常插入。

MySQL如果数据存在则更新,不存在则插入的更多相关文章

  1. MYSQL查看数据表最后更新时间

    MYSQL查看数据表最后更新时间 - 拨云见日 - CSDN博客 https://blog.csdn.net/warnerwu/article/details/73352774 mysql> S ...

  2. sql mysql和sqlserver存在就更新,不存在就插入的写法(转)

    转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9 sqlsever数据存在就更新,不存在就插入的两种方法 两种经常使用的方法: ...

  3. MySQL 误删数据、误更新数据(update,delete忘加where条件)

    MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...

  4. Mysql:如果数据存在则更新,不存在则插入

    mysql语法支持如果数据存在则更新,不存在则插入,首先判断数据存在还是不存在的那个字段要设置成unique索引, 例如表tb_addrbook如下: 索引: 语句1:不存在插入 INSERT INT ...

  5. MySQL:数据存在则更新,不存在则插入

    前提:表结构存在主键或唯一索引,插入数据包含主键或唯一索引而导致记录重复插入失败. 单条记录更新插入: ,,) ,b,c; 多条记录批量更新插入: ,,),(,,) ON DUPLICATE KEY ...

  6. C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)

    原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高.  包装了一个简单的sql ...

  7. mysql如果数据不存在,则插入新数据,否则更新的实现方法

    mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...

  8. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  9. MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理

    MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...

  10. MySQL load数据的时候自动更新时间

    MySQL load数据的时候自动更新时间 前提 CREATE TABLE table_name ( dt varchar(255) NULL , ctime timestamp NULL ON UP ...

随机推荐

  1. Python字典推导式

    要求打印字典中值小于1的key和value d = {"a": 1, "b":2, "c":3} d = {key: value for k ...

  2. 使用ssh 通过ProxyCommand:利用跳板机让不在同一局域网的机器ssh直连

    打开~/.ssh/config文件,如果没有则新建一个 输入以下内容并保存: Host dxx.sxx-bastion # jumpserver name hostname 54.65.xx.2xx ...

  3. 『玩转Streamlit』--图像与媒体组件

    Streamlit中的图像与媒体组件,主要是st.image.st.audio和st.video. 它们是专为在Streamlit Web应用程序中嵌入和展示多媒体内容而设计的,这些组件不仅丰富了应用 ...

  4. OSPF协议

    OSPF(Open Shortest Path First)开放式最短路径优先,是一种链路状态型路由协议,用于在网络中计算最短路径.OSPF协议是基于Dijkstra算法的,使用链路状态信息来计算最短 ...

  5. java内存区域——daicy

    Java虚拟机 运行时数据区 主要分为五部分:方法区,堆(这两块是所有线程共享的区域),程序计数器,本地方法栈,虚拟机栈(vm stack)(这三块为线程隔离区域) 程序计数器(Program Cou ...

  6. ZSTU2023校赛

    篠塚真佑実的树 给定\(n\)个节点的树,其中\(m\)个节点存在传送门,当飞船经过存在传送门的节点的时候,可以选择无消耗地传送至其他存在传送门的节点,现在有\(q\)次询问,每次询问给出起点\(st ...

  7. kettle 使用 CARTE 执行

    在执行KETTLE 任务的时候,可以使用本地执行,或者使用carte server执行. 1.启动carte server .\Carte.bat localhost 8080 2.配置子服务器 这里 ...

  8. WxPython跨平台开发框架之用户选择和标签组件的设计

    在系统的权限管理中,往往都会涉及到用户的选择处理,特别是基于角色的访问控制中,很多情况下需要用到选择用户的处理.本篇随笔,基于WxPython跨平台开发框架,采用原有开发框架成熟的一套权限系统理念,对 ...

  9. controller返回路径问题

    项目打包后,报错template might not exist or might not be accessible by any of the configured Template Resolv ...

  10. uniapp多次触发跳转问题

    问题描述:快速点击跳转页面后会闪退到登陆页面 解决方案:重新封装uniapp跳转api,加防抖锁,To.ts import { NavigateToOptions, RedirectToOptions ...