前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 插入数据时如何不插入重复的数据

MySQL 插入数据时如何不插入重复的数据

原创
作者头像
IT工作者
发布于 2021-12-30 03:19:16
发布于 2021-12-30 03:19:16
7.4K00
代码可运行
举报
文章被收录于专栏:程序技术知识程序技术知识
运行总次数:0
代码可运行

1. 业务场景

针对一些基础业务数据如用户表,要保证主键Primary或Unique不重复,如果在插入时做判断,效率低且代码复杂。

2. 实现方案

基于MySQL数据库,实现方案有如下4种

replace into 使用最简单,推荐

on duplicate key update 可以根据业务需要,当数据重复时,指定更新的内容。有对应使用场景时使用

insert ignore into 简单粗暴,可能会丢数据,不推荐

实现的功能类似于insert ingore into, 且使用复杂,不推荐

创建测试表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
drop table user;
CREATE TABLE user (
  id int(20) unsigned NOT NULL AUTO_INCREMENT,
  name varchar(10) DEFAULT NULL,
    mobile varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
    unique index idx_name (name) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;


insert into user(name,mobile) values('张三','13578901288');

2.1. replace into

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,

如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。

否则,直接插入新数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
replace into user(name,mobile) values('张三','13578901234');
replace into user set name='张三',mobile='13578901236';

注意:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

MySQL replace into 有三种形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
replace into tbl_name(col_name,) values()
replace into tbl_name(col_name,) select …
replace into tbl_name set col_name=value,

第一种形式类似于insert into的用法,

第二种replace select的用法也类似于insert select,这种用法并不一定要求列名匹配,事实上,MYSQL甚至不关心select返回的列名,它需要的是列的位置。例如,replace into tb1( name, title, mood) select rname, rtitle, rmood from tb2;

这个例子使用replace into从tb2中将所有数据导入tb1中, tb2与tb1的字段名不同。

第三种replace set用法类似于update set用法,使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。

2.2. on duplicate key update

先执行insert语句,当出现primary或者unique冲突时执行update语句,update语句则是需要更新的内容:使用新值替换数据库中的值

如示例,当用户名称冲突时,更新用户的手机号码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into user(name,mobile) values('张三','13578901235') on duplicate key update mobile='13578901235';

注意:插入数据的表必须有主键或者是唯一索引!否则的话会直接插入数据,这将导致表中出现重复的数据。

2.3. insert ignore into

当执行insert to出现冲突时不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则可能导致数据丢失

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert ignore into user(name,mobile) values('张三','13578901234');

2.4. insert … select … where not exist

根据select语句的条件判断是否插入,不需要插入数据的表必须有主键或者是唯一索引。示例如下:

但select语句的条件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO user (name,mobile) SELECT '王五','13578901236' FROM dual WHERE NOT EXISTS (SELECT name FROM user WHERE name = '王五') 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
介绍mysql中replace方法
今天在编程的时候,学习了replace into的用法,真的很好用,是insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3
wangxl
2018/03/07
2.1K0
分析replace into
三种语法似乎让人眼花缭乱,但我们首先要明确一点:replace into做的是什么,这样它后面不管跟的是values、select还是set都不重要。
平凡的学生族
2019/05/25
2K0
MySQL INSERT的4种形态
墨墨导读:MySQL中常用的四种插入数据的语句: insert ,insert select,replace into,insert into on duplicate key update,以下详述这四种插入数据的语句,希望可以帮助到大家。
数据和云
2020/08/11
1.6K0
入门MySQL——DML语句篇
在上篇文章中,主要为大家介绍的是DDL语句的用法,可能细心的同学已经发现了。本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作。
MySQL技术
2019/09/08
7990
MySQL DML 数据操作
如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则直接插入新数据。
恋喵大鲤鱼
2023/10/12
2060
MySQL replace into 用法
在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则先删除后再插入新数据行。
翎野君
2023/05/12
1.8K0
MySQL replace into 用法
Mysql4种方式避免重复插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
BUG弄潮儿
2020/10/19
2.8K0
MySQL数据库编程基础入门2
描述:学习MySQL除了一些基本的SQL语句以外,我们还需要学习MySQL扩展部分的知识;通过前面的学习我们知道SQL类型大致分为四类,在后面的学习采用这四类来入门了解使用MySQL 8.0;
全栈工程师修炼指南
2022/09/29
1.5K0
MySQL数据库编程基础入门2
如何防止MySQL重复插入数据,这篇文章会告诉你
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
用户5546570
2020/09/21
9680
Mysql 4种方式避免重复插入数据!
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:
xcbeyond
2020/11/03
12.5K0
Mysql 4种方式避免重复插入数据!
Mysql批量插入时,如何不插入重复的数据
业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入
Java旅途
2021/07/13
5.4K0
MySql 批量插入时,如何不插入重复的数据
来源:http://www.telami.cn/2018/when-mysql-batch-inserts-and-how-to-not-insert-duplicate-data/
逆锋起笔
2021/06/11
3.5K0
MySQL 教程上
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
acc8226
2022/05/17
3.4K0
oracle基础|什么是数据库操作语言|什么是DDL、DML、DCL
数据定义语言:是SQL语言集中负责数据结构定义与数据库对象定义的语言,create alter drop
小小鱼儿小小林
2021/12/28
1.2K0
MySQL 批量插入:如何不插入重复数据?
业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入
程序猿DD
2021/09/03
3.6K0
干货!超过500行的Mysql学习笔记
本文介绍了软件测试的基本流程和常用的测试工具。软件测试的基本流程包括需求分析、设计、编程、测试、部署和维护。常用的测试工具有QTP、Selenium、JMeter、LoadRunner等。
企鹅号小编
2018/01/09
1.3K0
干货!超过500行的Mysql学习笔记
MySQL中DML语句和事务的概念「建议收藏」
知识要点 DML语句 插入行到表中 删除表中的行 更新表中的行 控制事务
全栈程序员站长
2022/09/27
2.1K0
MySQL中DML语句和事务的概念「建议收藏」
一千行 MySQL 详细学习笔记(值得学习与收藏)
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格) 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 数据库操作 -- 查看当前数据库 SELECT DATABASE(); -
java思维导图
2019/01/09
2.8K0
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.3K0
相关推荐
介绍mysql中replace方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验