MySQL 语句级避免重复插入—— Insert Select Not Exist

本文介绍了一种在SQL中避免重复数据插入的技巧,利用INSERT...SELECT与NOT EXISTS组合,有效减少数据库操作次数,提高效率。同时展示了使用@detail变量进行唯一性检查的示例,并提到了replace into作为另一种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法。 

INSERT INTO table(column1,column2,column3 ...columnN)  
SELECT value1,value2,value3 ...valueN  
FROM dual  
WHERE NOT EXISTS(  
      SELECT *  
      FROM table  
      WHERE value = ?  
);

dual是为了构建查询语句而存在的表,Oracle中很常见,配合INSERT ... SELECT构建成我们需要的表,并指定了数据项. 
EXISTS通过这个判断是否存在的函数,就免去了我们做IF-ELSE的冗繁操作. 
例: 

INSERT INTO content (  
    detail,  
    status,  
    beginTime,  
    endTime)   
SELECT  
    @detail,  
    1,  
    NULL,  
    NULL  
FROM DUAL  
    WHERE NOT EXISTS(  
        SELECT contentId   
        FROM content   
        WHERE detail=@detail); 

@detail是要存入的内容,这里对内容进行了检索,如果要这么做,最好对该字段做唯一约束,或加索引。 
省掉了IF-ELSE,在iBatis配置一下就ok了,哈! 

还有个更坚决的办法——replace into: 

replace into blacklist(userInfoId,uid)  
select userInfoId,uid from user_info u where uid in(  
'u303565440','u303566922','u303515112','u303559738');  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值