避免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、总结

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

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 如何在MySQL防止重复数据插入 为了有效防止重复数据插入,可以采用多种方法和技术手段。以下是几种常见的解决方案: #### 使用唯一约束 (Unique Constraint) 通过定义列上的 `UNIQUE` 约束,数据库会自动拒绝任何试图插入已存在的值的操作[^1]。 例如,在创建表时指定某一列为唯一键: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE ); ``` 如果需要向现有表添加唯一约束,则可执行如下语句: ```sql ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email); ``` #### 插入前检查是否存在 (SELECT before INSERT) 另一种方式是在尝试插入新记录之前先查询目标字段是否已经存在。这种方法虽然简单易懂,但在高并发场景下可能导致竞态条件(race condition),即两个事务可能同时判断某条记录不存在并分别插入相同的数据。 推荐做法是结合事务处理机制来规避此风险: ```sql START TRANSACTION; IF NOT EXISTS(SELECT 1 FROM users WHERE email='example@example.com') THEN INSERT INTO users(email) VALUES('example@example.com'); END IF; COMMIT; ``` #### 利用ON DUPLICATE KEY UPDATE语法 当遇到主键或唯一索引冲突时,该语法允许更新某些特定字段而不是抛出错误。 假设我们有一个带有自增ID和邮箱地址作为唯一标识符的用户表,下面的例子展示了如何安全地增加积分而不会造成重复账户问题: ```sql INSERT INTO users (id, points, email) VALUES (NULL , 10,'test@test.org') ON DUPLICATE KEY UPDATE points=points+VALUES(points); ``` 这里需要注意的是只有发生违反PRIMARY KEY或者UNIQUE INDEX的情况才会触发UPDATE部分[^3]. #### 考虑覆盖索引(Covering Indexes) 对于频繁读取操作优化来说非常重要的一点就是尽可能减少访问实际存储区次数. 如果能够构建合适的复合索引来满足大部分检索需求的话就可以大大提升效率同时也间接帮助减少了不必要的写入动作从而降低了潜在冲突几率[^4]. 综上所述,合理运用上述策略之一即可有效地控制住Mysql中的重复项产生情况.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值