1. 业务场景
针对一些基础业务数据如用户表,要保证主键Primary或Unique不重复,如果在插入时做判断,效率低且代码复杂。
2. 实现方案
基于MySQL数据库,实现方案有如下4种
replace into 使用最简单,推荐
on duplicate key update 可以根据业务需要,当数据重复时,指定更新的内容。有对应使用场景时使用
insert ignore into 简单粗暴,可能会丢数据,不推荐
实现的功能类似于insert ingore into, 且使用复杂,不推荐
创建测试表
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 首先尝试插入数据到表中,
如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
否则,直接插入新数据。
replace into user(name,mobile) values('张三','13578901234');
replace into user set name='张三',mobile='13578901236';
注意:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
MySQL replace into 有三种形式:
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语句则是需要更新的内容:使用新值替换数据库中的值
如示例,当用户名称冲突时,更新用户的手机号码。
insert into user(name,mobile) values('张三','13578901235') on duplicate key update mobile='13578901235';
注意:插入数据的表必须有主键或者是唯一索引!否则的话会直接插入数据,这将导致表中出现重复的数据。
2.3. insert ignore into
当执行insert to出现冲突时不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则可能导致数据丢失。
insert ignore into user(name,mobile) values('张三','13578901234');
2.4. insert … select … where not exist
根据select语句的条件判断是否插入,不需要插入数据的表必须有主键或者是唯一索引。示例如下:
但select语句的条件
INSERT INTO user (name,mobile) SELECT '王五','13578901236' FROM dual WHERE NOT EXISTS (SELECT name FROM user WHERE name = '王五')
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有