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

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>

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

以上,希望你能帮到你;

相关推荐
ProcessOn15 小时前
纯干货!MySql实战02:一条SQL更新语句执行流程大探索!
sql·mysql·sql server
geovindu20 小时前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
泡海椒20 小时前
JQuick-SQL SELECT 投影:字段、别名与表达式查询
数据库·sql
猫咪很可爱20 小时前
mysqldump 失败常见场景
数据库·sql·mysql
其实防守也摸鱼21 小时前
Linux文本处理命令理论学习
linux·服务器·前端·数据库·sql·学习·安全
IM架构师21 小时前
# 一次老旧PHPCMS网站入侵排查:从SQL注入到PHP后门,以及IP白名单止血
sql·tcp/ip·php
泡海椒1 天前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
roman_日积跬步-终至千里2 天前
【数据Agent论文·查询与语义|06】RAT-SQL:怎样把问题、表和字段真正关联起来?
数据库·sql·数据分析
roman_日积跬步-终至千里2 天前
【数据Agent论文·查询与语义|11】EntSQL:给了业务文档,模型为何还是写不对SQL?
数据库·人工智能·sql·数据分析
毕业设计7032 天前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm