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

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

在PHP中,防止数据重复插入数据库主要有以下几种方式: 1. **使用唯一索引(Unique Indexes)**:在MySQL等支持的数据表上创建唯一约束或唯一索引,对于需要保证唯一性的字段,如主键,可以确保数据不会重复插入。 ```php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("INSERT INTO users (email) VALUES (:email) ON DUPLICATE KEY UPDATE email = :email"); $stmt->execute(['email' => $email]); ``` 这里`ON DUPLICATE KEY UPDATE`会检查该email是否已经存在,如果存在则更新而不是插入。 2. **使用唯一键(UNIQUE Constraints)**:对表中的特定列设置唯一键,这将强制检查新插入的值是否已存在于表中,若存在则插入失败。 ```sql ALTER TABLE users ADD UNIQUE (email); ``` 3. **自增ID结合事务(Transaction)**:在尝试插入之前先查询是否存在相同的ID,如果有则回滚事务,避免重复插入。 ```php $db = new PDO(...); try { if ($db->query("SELECT * FROM users WHERE id = ?", [$id])->rowCount()) { throw new Exception('Duplicate entry'); } // 插入操作 } catch (\Exception $e) { // 回滚事务 $db->rollBack(); } ``` 4. **使用预处理语句(Prepared Statements)**:利用预处理语句可以防止SQL注入,并能通过绑定参数自动处理重复插入。 ```php $stmt = $pdo->prepare("INSERT INTO users (email) VALUES (?) ON DUPLICATE KEY UPDATE email = ?"); $stmt->execute([$email, $email]); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值