不使用索引,添加数据,插入数据时防止重复

本文介绍了一种使用MyBatis实现的防重复插入数据的方法,通过在SQL语句中加入IGNORE关键字及NOT EXISTS子查询来确保数据唯一性。

mybatis 代码     觉得不错就点赞哦!!!

<!--防止插入重复数据,采用插入判断-->
<insert id="insertVariant" parameterType="com.wwx.datasynchronizer.entity.mingnew.VariantBean">
    INSERT IGNORE INTO  equipmentseries(equipId,name) SELECT #{id},#{name} FROM dual WHERE NOT EXISTS(SELECT * FROM equipmentseries WHERE equipId = #{id})
</insert>

关键代码

INSERT IGNORE INTO  表名('字段') 
SELECT '字段需要插入时的数据' FROM dual 
WHERE NOT EXISTS
(SELECT * FROM '表名' WHERE '需要被限制不重复的字段' = '被限制字段本次插入的数据')


关键词

IGNORE
NOT EXISTS

觉得不错就点赞哦!!!

数据库使用**唯一索引(Unique Index)**是防止数据重复插入的一种非常有效的方式。它通过数据库层面的约束机制,确保某列或某些列的组合值是唯一的,从而避免重复数据进入数据库。 --- ## ✅ 一、使用数据库唯一索引防止重复插入的原理 当你在数据库表中对某些字段(如 `external_id`、`business_key`)创建唯一索引后: - 如果插入数据在这些字段上与已有数据冲突,数据库会抛出 `DuplicateKeyException`; - 你可以在 Java 代码中捕获该异常并进行处理,从而实现防止重复插入。 --- ## ✅ 二、数据库操作步骤(以 MySQL 为例) ### 1. 创建表添加唯一索引 ```sql CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, external_id VARCHAR(50) NOT NULL, name VARCHAR(100), email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE (external_id) ); ``` ### 2. 或者对已有表添加唯一索引 ```sql ALTER TABLE user ADD UNIQUE (external_id); ``` --- ## ✅ 三、Java 代码示例(Spring Boot + JPA) ### 1. 实体类定义 ```java @Entity @Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = "external_id") }) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "external_id", nullable = false, unique = true) private String externalId; private String name; private String email; // getters and setters } ``` ### 2. Repository 接口 ```java public interface UserRepository extends JpaRepository<User, Long> { } ``` ### 3. 插入逻辑 + 异常处理 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public void processAndSaveUser(User user) { try { userRepository.save(user); System.out.println("数据插入成功:" + user.getExternalId()); } catch (DataAccessException e) { if (e.getCause() instanceof DuplicateKeyException) { System.out.println("数据已存在,跳过插入:" + user.getExternalId()); } else { System.err.println("插入数据发生错误:" + e.getMessage()); throw e; } } } } ``` --- ## ✅ 四、异常说明 - `org.springframework.dao.DuplicateKeyException` 是 Spring 对数据库唯一约束冲突的封装; - 该异常通常是由于唯一索引冲突导致的; - 你可以在全局异常处理器中统一处理此类异常。 --- ## ✅ 五、优点与注意事项 ### ✅ 优点: | 优点 | 说明 | |------|------| | 简单高效 | 数据库自动判断唯一性,无需手动查询 | | 线程安全 | 在并发场景下也能保证唯一性 | | 数据一致性 | 保证底层数据重复,适合关键业务 | ### ⚠️ 注意事项: | 事项 | 说明 | |------|------| | 唯一索引字段必须非空 | 否则可能无法生效(部分数据库允许多个 NULL 值) | | 需要捕获异常 | 否则程序会因为异常中断 | | 适合高频入场景 | 频繁冲突可能导致性能下降 | --- ## ✅ 六、进阶:结合幂等 Token 或业务字段 - 在分布式系统中,可以结合 Redis 缓存或数据库唯一索引双重保障; - 例如:先查 Redis 是否已处理,未处理再尝试插入数据库; - 或者使用 `upsert`(更新或插入)语句,如 MySQL 的 `ON DUPLICATE KEY UPDATE`。 --- ##
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值