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

2023-11-16


DUPLICATE、REPLACE INTO、REPLACE三种方式如何更新数据?

ON DUPLICATE KEY UPDATE

mysql语法支持如果数据存在则更新,不存在则插入,首先判断数据存在还是不存在的那个字段要设置成unique索引。1

语法:

INSERT INTO 表名(唯一索引列, 列2, 列3) VALUE(值1, 值2, 值3) ON DUPLICATE KEY UPDATE 列=值, 列=值

例如表tb_addrbook如下。

mysql> show create table tb_addrbook;
+-------------+-------------------------------------------+
| Table       | Create Table                              |
+-------------+-------------------------------------------+
| tb_addrbook | CREATE TABLE `tb_addrbook` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `num` int(11) NOT NULL DEFAULT '0',
  `name` varchar(16) NOT NULL DEFAULT '',
  `company` varchar(48) NOT NULL DEFAULT '',
  `job` varchar(32) NOT NULL DEFAULT '',
  `tel` varchar(16) NOT NULL DEFAULT '',
  `mobile` varchar(11) NOT NULL DEFAULT '',
  `mail` varchar(64) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `num` (`num`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4  |
+-------------+-------------------------------------------+
1 row in set (0.00 sec)

注意:表结构中唯一索引UNIQUE KEY `num` (`num`) USING BTREE

mysql> select * from tb_addrbook;
+----+-----+--------+--------------+--------+--------------+-------------+-------------+
| id | num | name   | company      | job    | tel          | mobile      | mail        |
+----+-----+--------+--------------+--------+--------------+-------------+-------------+
|  1 |   0 | 小张   | 小张科技     | 支援   | 010-12345678 | 13600000000 | 123@123.com |
+----+-----+--------+--------------+--------+--------------+-------------+-------------+
1 row in set (0.00 sec)

语句1:不存在则插入

INSERT INTO tb_addrbook(num,name,mobile) VALUE('1001','小李','13112345678') ON DUPLICATE KEY UPDATE name= '小李',mobile='13112345678'

mysql> select * from tb_addrbook;                                                                                        
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小张   | 小张科技     | 支援   | 010-12345678 | 13600000000 | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 13112345678 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
2 rows in set (0.00 sec)

语句2:存在则更新

INSERT INTO tb_addrbook(num,name,mobile) VALUE('1001','小李','18800000000') ON DUPLICATE KEY UPDATE name= '小李',mobile='18800000000'

mysql> select * from tb_addrbook;                                                                                        
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小张   | 小张科技     | 支援   | 010-12345678 | 13600000000 | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 18800000000 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
2 rows in set (0.00 sec)

语句3:存在则更新。insert部分 与 update部分 不同时,update中的部分生效。
INSERT INTO tb_addrbook(num,name,mobile) VALUE('1001','小李','18800000000') ON DUPLICATE KEY UPDATE name= '小李',mobile='1880'

mysql> select * from tb_addrbook;                                                                                        
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小张   | 小张科技     | 支援   | 010-12345678 | 13600000000 | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 1880        |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
2 rows in set (0.00 sec)

语句4:INSERT部分,未指明唯一索引列;则更新第一行记录
INSERT INTO tb_addrbook(id, name, mobile) VALUES(3, '小王', '33333333333') ON DUPLICATE KEY UPDATE name='小王',mobile='12ile='1234'

mysql> SELECT * FROM tb_addrbook;                                                                                        
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小王   | 小张科技     | 支援   | 010-12345678 | 1234        | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 13112345678 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+

特点

  • DUPLICATE不会删除原有的记录。即:不会破坏索引。

REPLACE INTO

REPLACE INTO 主要作用类似 INSERT 插入操作。主要的区别是 REPLACE INTO 会根据主键或者唯一索引检查数据是否存在,如果存在就先删除再更新。2

语法:

REPLACE INTO 表名称(列1, 列2, 列3) VALUES(值1, 值2, 值3)

语句1:不存在则插入

mysql> REPLACE INTO tb_addrbook(num, name, mobile) VALUES(3000, '小山', '14412341234');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM tb_addrbook;
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小王   | 小张科技     | 支援   | 010-12345678 | 1234        | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 13112345678 |             |
|  3 | 3000 | 小山   |              |        |              | 14412341234 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+

注意:此时的主键id=3;

语句2:存在则先删除后插入

mysql> REPLACE INTO tb_addrbook(num, name, mobile) VALUES(3000, '小山', '14412341234');
Query OK, 2 rows affected (0.00 sec)

注意:上述语句导致2行数据受影响。是什么原因呢?

mysql> SELECT * FROM tb_addrbook;
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 小王   | 小张科技     | 支援   | 010-12345678 | 1234        | 123@123.com |
|  2 | 1001 | 小李   |              |        |              | 13112345678 |             |
|  4 | 3000 | 小山   |              |        |              | 14412341234 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
3 rows in set (0.00 sec)

注意:此时的主键id=3的一条记录被删除,重新插入了一条主键id=4的新记录。

特点

  • REPLACE INTO底层是先删除后插入数据,会破坏索引、重新维护索引
  • 必须要有主键或唯一索引才能有效,否则replace into就只新增了

REPLACE

replace是mysql 里面处理字符串比较常用的函数,可以替换字符串中的内容。类似的处理字符串的还有trim截取操作。3

语法

replace(object,search,replace)

语句1:查询结果替换

mysql> SELECT REPLACE('www.baidu.com', 'w', 'n');
+------------------------------------+
| REPLACE('www.baidu.com', 'w', 'n') |
+------------------------------------+
| nnn.baidu.com                      |
+------------------------------------+
1 row in set (0.00 sec)

语句2:更新数据

mysql> UPDATE tb_addrbook SET name=REPLACE(name, '小', '大');
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> SELECT * FROM tb_addrbook;
+----+------+--------+--------------+--------+--------------+-------------+-------------+
| id | num  | name   | company      | job    | tel          | mobile      | mail        |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
|  1 |    0 | 大王   | 小张科技     | 支援   | 010-12345678 | 1234        | 123@123.com |
|  2 | 1001 | 大李   |              |        |              | 13112345678 |             |
|  4 | 3000 | 大山   |              |        |              | 14412341234 |             |
+----+------+--------+--------------+--------+--------------+-------------+-------------+
3 rows in set (0.00 sec)

参考


  1. IT技术院. Mysql:如果数据存在则更新,不存在则插入(面试必考) [EB/OL]. https://www.toutiao.com/a6711469973560115715/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1563073321&app=news_article&utm_source=weixin&utm_medium=toutiao_android&req_id=201907141102000100280171399768E82&group_id=6711469973560115715 ↩︎

  2. 程序汪汪. Mysql中超级简洁语法replace into存在就更新,偷懒就这么简单 [EB/OL]. https://www.toutiao.com/a6643545991666467342/ ↩︎

  3. 波波说运维. 详解Mysql数据库中replace与replace into的用法及区别 [EB/OL]. https://www.toutiao.com/a6702645391197733387/ ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • MySQL InnoDB 约束不起作用

    我偶然发现 innoDB 约束的奇怪行为 但找不到原因 我有包含数据的表格 下面列出了它们的结构 CREATE TABLE contents id int 10 unsigned NOT NULL AUTO INCREMENT title
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 如何将数据源url查询参数添加为application.properties?

    是否可以添加数据源 url 参数作为额外属性 或者我总是必须将它们作为查询参数直接附加到 url 中 Example spring datasource url jdbc mysql localhost test useSSL false
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • Innodb页面大小设置

    在innodb中 页面大小默认为16kb 如何将页面大小设置为 8kb 是否有在源编译步骤中设置的选项 您不需要在源编译步骤中指定页面大小 MySQL 5 6 及更高版本支持不同的页面大小 无需重新编译 但是 您必须在初始化 InnoDB

随机推荐

  • make[1]: [persist-settings] Error 2 (ignored) CC adlist.o /bin: cc: command not found make[1]: *

    Linux系统安装Redis执行Make编译时报错 make 1 persist settings Error 2 ignored CC adlist o bin cc command not found make 1 adlist o E
  • 微信小程序 scroll-view的滚动条设置

    小程序的scroll view用的比较多了 列表页一般也没管它的滚动条 最近突然发现在android与ios中横向滑动的时候表现不一样 不一样在哪呢 ios上直接就不显示啊 也是没谁了 深入想了一下 这滚动条能不能换一颜色或者换个样式 有这
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现

    AIOT技术的智慧校园空调集中管控系统设计与实现本科毕业论文 I 引言 本文旨在探讨基于AIOT技术的智慧校园空调集中管控系统的设计和实现 首先 综述当前AIOT技术发展状况和智慧校园空调集中管控系统在当前应用领域中的重要性 其次 分析相关
  • 原理图符号(原理图库)创建流程及注意事项

    参考资料 电巢EMEA体验营二期 1 原理图符号创建流程 1 0 元器件属性 以一款压力传感器芯片LPS22HH为例 来讲解原理图符号的创建流程 LPS22HH的引脚描述如下所示 1 1 创建工程 1 2 创建原理图符号文件 创建完成原理图
  • Xilinx BUFGMUX使用注意事项

    Xilinx BUFGMUX使用注意事项 最近使用Xilinx FPGA的时候 需要用到一个外部时钟和一个PLL产生的时钟 可以通过外部SWICH进行时钟的切换 觉得这种方式可以通过原语例化完成 原语 果不其然 在原语示例中找到了类似的模块
  • java基础:浅谈泛型

    1 为什么要使用泛型 给一段代码 import java util ArrayList import java util List public class GenericList error public static void main
  • 解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”

    我的Eclipse版本是3 6 1 Override 时出现以下错误 The method XXXXXX of type XXXXXXXXX must override a superclass method 上网搜索原来原因是 实现类里面
  • Docker 部署Streamlit项目

    文章目录 前言 关于streamlit Docker 部署Streamlit项目 Streamlit如何部署到云服务器 1 安装docker 2 拉取python镜像 2 1 什么是DockerHub 2 2 配置docker加速器 2 3
  • SpringMVC增删改查(CRUD)的实现

    目录 前言 一 前期准备 1 pom xml 依赖与插件的导入 2 jdbc properties 数据库连接 3 log4j2 xml 日志文件 4 spring mybatis mybatis与spring整合文件 5 spring c
  • 解决AttributeError: module 'tensorflow' has no attribute 'ConfigProto'

    使用CUDA10 1加上Tensorflow 2 0会出现AttributeError module tensorflow has no attribute ConfigProto 这个问题 这个是由于现在新版本中一些1 0版本的函数被和2
  • Android自动化测试中操作技巧合集(建议收藏)

    Android自动化测试中短信验证码的操作技巧 一 内容提供器机制简介 Android 系统采用了内容提供器 ContentProvider 机制来管理不同应用的数据访问 内容提供器为不同应用间的数据共享提供了接口 它们像是一个中央数据仓库
  • 快速中值求取算法

    中值 顾名思义 就是指一个从小到大的序列的中间的那一个数 一般的讲 中值比平均值还要更加稳定 如一个序列中的某一个值被误乘以了100 平均值则会有很大的波动 但是中位数则不会发生太大的变化 但是如果对数据先排序 然后再进行取中值 则比较耗时
  • Spring3与安全框架apache shiro的整合

    shiro是一个很不错的安全框架 相对Spring security 来说要简单易用的多 使用shiro来做web的权限子系统是不错的选择 下面记录一下shiro和Spring整合的过程 Applicationcontext shiro x
  • k-近邻算法

    k 近邻算法 k 近邻算法概述 k 近邻算法 k NearestNeighor Algorithm 是采用测量不同特征值之间的距离方法进行分类 简称kNN 这里用到的距离计算是欧几里德距离 工作原理 存在一个样本数据集合 i 0 n 也称作
  • 《Ansible Playbook扩展:block块》

    一 用块分组任务 block任务块就是一组逻辑的tasks 使用block可以将多个任务合并为一个组 示例如下 block name 检查 service 服务 role 节点端口 shell nc vz MYSQL MASTER HOST
  • OpenGL 超级宝典笔记 —— 纹理高级(三)

    纹理组合器 OpenGL 的纹理组合器可以控制多重纹理的片段是如何组合的 一般情况下 我们可以简单的为每个纹理单元设置一个纹理环境模式 GL REPLACE GL DECAL GL ADD 和 GL MODULATE 把每个纹理应用的结果添
  • LNMP1.3 phpMyAdmin 打开空白的问题

    如果你找了很多方法 比如修改配置文件等等 都没有办法的话 或许我这里可以解决这个问题 请回忆一下 你 是否 安装了 eAccelerator 这个东西 如果有 卸载掉就好了 坑人的eAccelerator addons sh uninsta
  • ug装配绕轴旋转_UG模具设计培训就到新科教育

    培训内容 1 机械CAD精品班 CAD初级 制图 CAD基础及简单施工图 建筑剖面图 立面图 机械剖面 立面图等绘制CAD三维制图 面域 实体建模 曲面拉伸成形 剖切 三维实体运算 平移曲面 旋转曲面等方法建模 灯光设置 材质表现 工程出图
  • C++动态内存管理

    动态内存 在C C 程序中 线程 栈空间是有限的 大部分变量使用的都是动态分配来的堆内存 这些动态申请来的堆内存是需要开发者通过代码去自行管理的 如何管理好这些动态申请来的内存 是C C 开发中的一个重点难点问题 malloc是开空间 ca
  • Mysql:如果数据存在则更新,不存在则插入

    文章目录 ON DUPLICATE KEY UPDATE 语法 特点 REPLACE INTO 语法 语句1 不存在则插入 语句2 存在则先删除后插入 特点 REPLACE 语法 参考 DUPLICATE REPLACE INTO REPL