MySql插入唯一键冲突的三种可选方式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySql插入一条记录,结果提示主键冲突,怎么办?批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法直接忽略掉冲突的记录么?下面简单记录三种处理方式

image.png


MySql插入时唯一键冲突的几种处理方式



MySql插入一条记录,结果提示主键冲突,怎么办?


批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法直接忽略掉冲突的记录么?


下面简单记录三种处理方式


I. 插入时唯一键冲突问题


1. Ignore关键词


某些场景下,我们需要批量插入的数据,某些已经在DB中了,因此我希望在出现冲突时,直接跳过,把能插入的都插入就好,这种情况下,使用ignore关键词就比较合适了

一个实际的case如下


insert ignore into table (xxx, xxx) values (xxx,xxx), (xxx, xxx);
复制代码


执行截图如下, 注意下面红框中的内容,表示忽略了两条,执行插入成功一条

image.png


2. Replace Into方式


如果在批量插入中,存在冲突时,我希望用我的新数据替换旧的数据,这个时候就可以使用replace into


常用姿势如下

replace into `user` (`id`, `name`, `create_at`, `update_at`) 
values
  (1, 'test', '2018-07-10 18:54:00', '2018-07-10 19:54:52'),
  (2, 'test2', '2018-07-10 18:54:00', '2018-07-10 19:54:52'),
  (3, 'test3', '2018-07-10 18:54:00', '2018-07-10 19:54:52');
复制代码


执行截图如下,注意红框中,当某条记录冲突之后并修改,则影响行数为2, 其实际过程是


  • 删除冲突数据
  • 插入新的数据

image.png


3. ON DUPLICATE KEY UPDATE


在出现冲突时,希望更新某些数据,这个时候就可以在insert语句的最后加上on duplicate key update


实例如下

insert into `user` (`id`, `name`, `create_at`, `update_at`) values (1, 'test0', '2018-07-10 18:54:00', '2018-07-10 18:54:52') ON DUPLICATE KEY UPDATE `update_at`='2018-07-10 19:58:05';
复制代码


执行截图如下,这个是在原记录的基础上执行更新指定的value, 比如上面的插入中,当冲突时,我们只更新update_at字段,而name的test0没有更新


image.png


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL Kubernetes 监控
在 k8s 环境中使用 mysql 部署 dolphinscheduler (非 helm 的方式)
在 k8s 环境中使用 mysql 部署 dolphinscheduler (非 helm 的方式)
1728 0
|
安全 关系型数据库 MySQL
【数据库】centos 7系统,二进制方式安装mysql
【数据库】centos 7系统,二进制方式安装mysql
308 0
【数据库】centos 7系统,二进制方式安装mysql
|
关系型数据库 MySQL 程序员
在 Windows 命令提示符下启动 MySQL:net start mysql 发生系统错误 5。 拒绝访问。解决方式小结
在 Windows 命令提示符下启动 MySQL:net start mysql 发生系统错误 5。 拒绝访问。解决方式小结
546 1
在 Windows 命令提示符下启动 MySQL:net start mysql 发生系统错误 5。 拒绝访问。解决方式小结
|
IDE 关系型数据库 MySQL
MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
502 0
MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
|
关系型数据库 MySQL Apache
|
存储 关系型数据库 MySQL
MySQL InnoDB的插入缓冲Insert Buffer
MySQL InnoDB的插入缓冲Insert Buffer
141 0
MySQL InnoDB的插入缓冲Insert Buffer
|
SQL 存储 关系型数据库
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
164 0
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
|
SQL 关系型数据库 MySQL
MySQL插入Emoji表情
MySQL插入Emoji表情
MySQL插入Emoji表情
|
关系型数据库 MySQL Linux
Linux 使用rpm方式安装最新mysql(5.7.22)步骤以及常见问题解决
Linux 使用rpm方式安装最新mysql(5.7.22)步骤以及常见问题解决
282 0
Linux 使用rpm方式安装最新mysql(5.7.22)步骤以及常见问题解决
|
安全 关系型数据库 MySQL
【Docker 基础教程】Mysql主从服务搭建------Mysql容器闪退及容器名冲突系列问题
【Docker 基础教程】Mysql主从服务搭建------Mysql容器闪退及容器名冲突系列问题
212 0
【Docker 基础教程】Mysql主从服务搭建------Mysql容器闪退及容器名冲突系列问题