编码技巧——批量删除数据

1. 背景

今天遇到个业务场景需要批量根据索引删除数据,ORM框架为mybatis,跟以往遇到的根据MySQL主键批量删除不同,本次使用的数据库时PgSQL,使用的联合主键索引;搜索相关资料网上大部分帖子都是使用类似 where id in (...) 的写法,直到找到花了点时间才找到合适的写法,现在总结下;

2. 代码

(1)对于单列主键一般使用IN语句

XML 复制代码
    <delete id="batchDelByIds" parameterType="list">
        delete
        from t_data
        where id in
        <foreach collection="list" item="batchId" index="index" open="(" close=")" separator=",">
            #{batchId}
        </foreach>
    </delete>

(2)使用OR语句连接多个条件

XML 复制代码
    <delete id="batchDelByNameAgeEntrys" parameterType="list">
        delete
        from t_data
        where
        <foreach collection="list" item="item" index="index" separator=" or ">
            (`name`={#item.name,VARCHAR} and `age`={#item.age,INTEGER})
        </foreach>
    </delete>

(3)使用多条DELETE语句执行

XML 复制代码
    <delete id="batchDelByNameAgeEntrysV2" parameterType="list">
        <foreach collection="list" item="item" index="index" separator=";">
            delete
            from t_data
            where
            `name`={#item.name,VARCHAR} and `age`={#item.age,INTEGER}
        </foreach>
    </delete>

注意,这种写法需要sql连接支持多条语句执行,需要在jdbc.url上加上多语句命令的参数,例如:

Lua 复制代码
spring.datasource.url=jdbc:mysql://127.0.0.1:11070/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true

(4)使用多参数的IN语句

XML 复制代码
    <delete id="batchDelByIds" parameterType="list">
        delete
        from t_data
        where (`name`, `age`) in
        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
            ({#item.name,VARCHAR}, {#item.age,INTEGER})
        </foreach>
    </delete>

本次的场景就适合这种写法;注意,如果多字段非联合索引,建议新建联合索引;

以上,希望你能帮到你;

相关推荐
月落归舟11 小时前
一篇文章了解Redis内存淘汰机制与过期Key清理
数据库·redis·mybatis
rockey62713 小时前
AScript如何实现LINQ语法
sql·c#·.net·linq·script·eval·expression
Mike117.20 小时前
GBase 8c 里 search_path 没管住,SQL 可能跑到另一个对象上
数据库·sql·postgresql
C137的本贾尼21 小时前
子查询与合并查询:SQL 的高级过滤技巧
数据库·sql
小江的记录本21 小时前
【MySQL】《MySQL日志面试背诵版+思维导图》(核心考点 + MySQL 8.0最新优化)
java·数据库·后端·python·sql·mysql·面试
BD_Marathon21 小时前
SQL学习指南——创建和填充数据库
数据库·sql
云边有个稻草人1 天前
金仓数据库标量子查询消除:解决复杂SQL性能瓶颈
数据库·sql·性能调优·金仓数据库·kes·标量子查询·数据库内核
小杍随笔1 天前
【LiteAdmin(sql-admin)项目前后端架构深度分析】
数据库·sql·架构·rust
小江的记录本1 天前
【MySQL】MySQL日志体系:redo log/undo log/binlog 三者区别、两阶段提交、如何保证数据一致性
java·数据库·后端·python·sql·mysql·面试
Devin~Y1 天前
大厂Java面试实录:Spring Boot/WebFlux、JVM调优、Redis/Kafka、Spring Cloud 与 RAG/Agent 追问
java·jvm·spring boot·maven·mybatis·jpa·spring webflux