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

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

原创
作者头像
IT工作者
发布2021-12-30 11:19:16
7K0
发布2021-12-30 11:19:16
举报
文章被收录于专栏:程序技术知识

1. 业务场景

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

2. 实现方案

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

replace into 使用最简单,推荐

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

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

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

创建测试表

代码语言:javascript
复制
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
复制
replace into user(name,mobile) values('张三','13578901234');
replace into user set name='张三',mobile='13578901236';

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

MySQL replace into 有三种形式:

代码语言:javascript
复制
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
复制
insert into user(name,mobile) values('张三','13578901235') on duplicate key update mobile='13578901235';

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

2.3. insert ignore into

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

代码语言:javascript
复制
insert ignore into user(name,mobile) values('张三','13578901234');

2.4. insert … select … where not exist

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

但select语句的条件

代码语言:javascript
复制
INSERT INTO user (name,mobile) SELECT '王五','13578901236' FROM dual WHERE NOT EXISTS (SELECT name FROM user WHERE name = '王五') 

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档