如果数据存在则更新,不存在则插入,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. vscode连接docker时需要为docker容器开设一个映射端口

    相关: vscode远程连接远程主机上的docker -- 设置命令 -- -p 5001:5001 设置端口: -p 5001:5001 命令Demo: docker run -it -v /hom ...

  2. 人工智能模型训练技术:随机失活,丢弃法,Dropout

    前一篇:<探索训练人工智能模型的词汇大小与模型的维度> 序言:Dropout 是神经网络设计领域的一种技术,通常我们把它翻译成 随机失活 或者 丢弃法.如果训练神经网络的时候不用 Drop ...

  3. 关于Requests交互超时的处理方式

    拿 https://aes.cryptohack.org/ecb_oracle 这道题来做示范. 由于这个链接的本地服务器在外国,因此我们很容易就会连接超时. 如下一个脚本: import reque ...

  4. 基于antlr的表达式解析器——函数类型验证

    package daicy.formula.evaluator; import java.util.HashMap; import java.util.Map; import org.antlr.ru ...

  5. Java线程:新特征-条件变量

    条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量.但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往通过代码来赋予其含义.   这里的条 ...

  6. HTML5 A链接

    1.基本使用 a标签常用属性: 属性名 说明 href 规定链接的目标 URL target 已什么形式打开这个连接 target属性有以下几个值 属性名 说明 _self 默认,当前页面跳转 _bl ...

  7. Python版本与Jupyter记录

    最近使用Python的时候,遇到一个版本问题.我本地安装的Python版本是3.8.0,在使用match...case...语法时,提示如下报错: 查询之后,才知晓3.8.0还没有match语法,ma ...

  8. ClickHouse 物化视图学习总结

    物化视图 物化视图源表--基础数据源 创建源表,因为我们的目标涉及报告聚合数据而不是单条记录,所以我们可以解析它,将信息传递给物化视图,并丢弃实际传入的数据.这符合我们的目标并节省了存储空间,因此我们 ...

  9. 使用C#获取文件详情

    有对应的需求,需要获取文件的详细信息内容.该页面信息大部分来源于文件的版本信息,使用FileInfo类并不能获取到. VERSIONINFO 资源 - Win32 apps | Microsoft L ...

  10. 《前端运维》二、Nginx--2请求处理流程及核心模块

    前一篇内容,我们学习了nginx的一些基本概念.安装和目录的作用.这篇文章我们来学习一些更加深入的内容. 一.Nginx请求处理流程 我们先来看张图吧: 我们看上图,首先客户端请求到Nginx服务器, ...