避免Mysql插入重复数据的几种方法

在这里插入图片描述

1、前言

在平时对数据库操作时,有时候需要向数据库中插入一些数据,此时就需要使用数据库的插入语句,但是在向数据中库插入数据时,不能盲目插入,因为盲目的插入可能会造成数据重复,浪费数据库的资源,所以一般情况下数据库中都会有所谓的主键,要求被选用的主键字段或者组合不能重复,这样可以避免一些脏数据的产生,但是同时又带来了一些不友好的操作,比如当在插入某条数据时,主键字段的值已经存在了,此时如果直接使用insert into语句进行插入时,则会报错,提示该字段的值已经存在,但是有时候我们并不希望看到语句报错,所以这就带来了一些不好的操作体验,为了避免这种报错的产生,最好的方式就是在插入的时候避免主键重复。如果实在避免不了。使用如下几种语法,同样可以达到不报错的效果。

语法 备注(存在主键)
insert ignore into 若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert into not exists 若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert into on duplicate key update 若在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
replace into 若在数据库已经存在,则直接删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

2、案例

测试数据库

-- auto-generated definition
create table if not exists  t_admin
(
    id        int auto_increment
        primary key,
    adminName varchar(50) null,
    passWord  varchar(50) null
);
INSERT INTO t_admin (id, adminName, passWord) VALUES (1, 'admin', 'admin');
INSERT INTO t_admin (id, adminName, passWord) VALUES (2, 'xiaoqian', '123456');

2.1 、insert ignore into

解释:

​ 存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

insert ignore into t_admin value (2,'itbestboy','123456');

在这里插入图片描述

可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度,如果按着平时的操作是肯定会报错的。

报错

在这里插入图片描述

2.2、 insert into not exists

解释:

存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

insert into t_admin select 2,'itbestboy','123456' from t_admin where not exists(select id from t_admin where id=2);

在这里插入图片描述

可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度.

2.3、insert into on duplicate key update

解释:

存在主键, 若插入的数据主键值在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。

-- 主键值在数据库中已经存在,此时会先执行update 语句,然后在插入,
insert  into t_admin value (2,'itbestboy','123456') on duplicate key update adminName='itbestboy', passWord='123456';
-- 注;当update语句后跟的值与value中的值不一致时,会按着update语句后的值进行入库操作。

在这里插入图片描述

若主键值在数据库中不存在,则会直接插入,update语句失效

 insert  into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';

在这里插入图片描述

2.4、replace into

存在主键, 若插入的数据主键值在数据库已经存在,则先删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。

-- 主键值在数据库中已经存在,此时会先删除这条记录,然后重新插入数据库中
replace into t_admin (id, adminName, passWord) VALUES (3, 'boy', '123456');

在这里插入图片描述
在这里插入图片描述

若主键值在数据库中不存在,则会直接插入,删除语句失效

 insert  into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';

在这里插入图片描述
在这里插入图片描述

3、总结

虽然上述方法可以避免主键值重复时插入报错,但是有时候,我们就需要看到相应的报错信息,才会更加有利于调试,所以至于怎么使用何时使用需要视情况而定。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40520912/article/details/128622896