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

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>

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

以上,希望你能帮到你;

相关推荐
kumat11 小时前
分享-搭建个人系统 MySelfSys
sql·系统
星马梦缘13 小时前
数据库作战记录 实验7、8
数据库·sql·oracle
weoptions14 小时前
简单sql注入中如何通过简单语句判断注入类型&注入方法
数据库·sql
小短腿的代码世界14 小时前
Qt数据库编程深度解析:从SQL基础到ORM架构设计
数据库·sql·qt
红云梦17 小时前
官方 Anthropic Postgres MCP Server 存在 SQL 注入漏洞 -- SafeDB 是如何做到 4 层防御的
数据库·sql
消失的旧时光-194320 小时前
SQL 第一篇:CRUD 实战,从 user 表开始写接口
数据库·sql·mysql
悠悠121381 天前
一条 SQL 从敲下回车,到在 MySQL 里“跑完一生”,中间到底经历了啥?
数据库·sql·mysql
山峰哥1 天前
SQL优化从入门到精通:20个案例破解性能密码
数据库·sql·oracle·性能优化·深度优先
努力努力再努力wz1 天前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql
历程里程碑1 天前
MySQL数据类型全解析 + 代码实操讲解
大数据·开发语言·数据库·sql·mysql·elasticsearch·搜索引擎