首页 > 数据库 >PostgreSQL -- 使用 Mybatis 时对数据库的多个删除操作

PostgreSQL -- 使用 Mybatis 时对数据库的多个删除操作

时间:2024-09-01 21:36:29浏览次数:12  
标签:PostgreSQL name 删除 记录 -- Mybatis table where id

 

在 Java 中使用 Mybatis 与 PostgreSQL 数据库进行交互时,删除操作的语句根据不同的场景应用不同。

 

1. 删除表内所有记录

 删除表内所有的记录。谨慎使用!

    <!-- 1. 删除表内所有记录 -->
    <delete id="deleteALl">
        delete from table_name;
    </delete>

2. 根据主键删除记录

 根据表的主键删除单条记录。

    <!-- 2. 根据主键删除单条记录 -->
    <delete id="deleteById" parameterType="java.lang.Integer">
        delete from table_name where id = #{id};
    </delete>

3. 根据多个条件删除记录

 根据多个列的值为条件删除。

    <!-- 3. 根据多个列的值为条件删除。 -->
    <delete id="deleteByConditions" parameterType="map">
        delete from table_name where column1 = #{column1} and column2 = #{column2};
    </delete>

4. 根据表内多个ID删除记录

 有批量ID(id集合),希望根据id遍历删除,使用 <foreach> 标签。

    <!-- 4. 根据多个 id 批量删除。 -->
    <delete id="deleteByIds" parameterType="list">
        delete from table_name where
            <foreach collection="list" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
    </delete>

5. 根据子查询结果删记录

    <!-- 5. 根据子查询结果删除。 -->
    <delete id="deleteBySubQuery">
        delete from table_name where id in (select id from another_table_name where condition = #{condition});
    </delete>

6. 根据某一时间点删除某个时间区间的记录

    <!-- 6. 根据某一时间点删除某个时间区间的记录。 -->
    <delete id="deleteByTime">
        delete from table_name where colum_time between #{earlierTime} and #{nowTime};
    </delete>

7. 删除重复记录

 删除表内重复记录。在需要删除重复记录并且保留每个分组的其中一条记录时非常有用。

    <!-- 7. 删除重复记录。 -->
    <delete id="deleteDuplicates">
        delete from table_name where id in
           (select id from
              (select id, row_number() over (partition by column1, column2 order by id) as row_num from table_name)
                 temp_table where temp_table.row_num > 1);
    </delete>

 row_number() 是一个窗口函数,用于生成每个分区中的行的唯一序列号;

 partition by column1, column2 order by id 是按数据 column1,column2 (字段1,2)相同值的记录分为一组,并根据 id 对每组记录进行排序; 

 如此,每个组内的记录会根据 id 赋予 一个序号(row_num)。组内第一个记录的 row_num 值为1,第二个为2,以此类推。

 子查询 生成一个 包含 id 和 row_num 的临时表 temp_table,而 row_num 大于1的记录就是重复的记录。外层的子查询从临时表 temp_table 选择 row_num 大于1的所有记录的 id(即重复记录的 id )。

8. 根据联合条件删除多表中的记录(级联删除)

 需要删除多表内的相关记录,可以使用事务或CASCADE规则(需在数据库表设计中定义)。

 

 

9. 根据动态条件删除

 如果条件是动态的,可以使用 Mybatis 的 <if> 标签构建动态SQL。

    <!-- 9. 根据动态条件删除。 -->
    <delete id="deleteByDynamicConditions" parameterType="map">
        delete from table_name where 1=1
        <if test="column1 != null and column1 != ''"> and column1 = #{column1} </if>
        <if test="column2 != null and column2 != '' "> and column2 = #{column2} </if>
    </delete>

 

10. 批量删除

 批量删除通过单个SQL语句或多个删除操作实现。一般结合事务确保批量操作的原子性。

    <!-- 10. 批量删除。 -->
    <delete id="batchDelete" parameterType="list">
        <foreach collection="list" item="item" separator=";">
            delete from table_name where id = #{item.id}
        </foreach>
    </delete>

11. 使用 CTE(共用表达式)删除记录 

 PostgreSQL支持使用CTE来执行删除操作。

    <!-- 11. 使用 CTE(共用表达式)删除记录 。 -->
    <delete id="deleteUsingCTE">
        with cte as 
            (select id from table_name where condition = #{condition})
        delete from table_name where id in (select id from cte);
    </delete>

 with cte as 定义一个 名为 cte 的公用表达式,查询表内符合 condition 条件的 id,将结果集临时存在 cte 内;最后删除 表内 id 在 cte 结果集的记录。

 

 

注意:删除操作不可逆,建议做好备份,做到事务原子性与数据一致性。

 

 


 

标签:PostgreSQL,name,删除,记录,--,Mybatis,table,where,id
From: https://www.cnblogs.com/warmNest-llb/p/18391780

相关文章

  • pip install METIS
    python的包METIS需要在本地安装METIS,METIS本身又是依赖GKlib的,所以需要首先编译GKlib,然后编译METIS编译GKlibmakeconfigCONFIG_FLAGS='-DBUILD_SHARED_LIBS=ON-DCMAKE_INSTALL_PREFIX=/home/hongyu_gao2001/GKlib'编译METISmakeconfigshared=1cc=gccprefi......
  • 自我介绍+软工5问
    |这个作业属于哪个课程|<班级的链接>||-----------------|---------------||这个作业要求在哪里|<作业要求的链接>||这个作业的目标|<你理解的作业目标具体内容>|自我介绍:我叫巴音才次克,是计科4班的,本人性格开朗,活泼兴趣爱好广泛,例如看剧、听歌等。问题:1.有......
  • router+firewall+switch
    1、网络拓扑图2、核心配置1)端口ip地址intg0/0/0ipaddress10.1.2.224intg1/0/0ipaddress10.1.1.1242)加入trustuntrustdmzfirewallzonetrustaddintg0/0/0firewallzoneuntrustaddintg1/0/03)security-policysecurity-policyrulenameintoout source-zonetru......
  • 容器存储接口--CSI
    目录一、背景二、CSI是什么三、CSI系统架构1、CSI如何与k8s组件相互通信2、CSI由哪些组件组成3、CSI的工作原理4、k8s存储中涉及的组件及其作用4.1、SidecarContainers4.1.1、external-attacher4.1.2、external-provisioner4.1.3、external-resizer4.1.4、external-snaps......
  • Radiant Photo 1.4.1激活版 AI智能完美照片修图插件详细安装教程(附下载链接)
    前言RadiantPhoto是一款高效的照片编辑与增强应用。这款软件配备了多样化的编辑工具及特效,使得用户能够便捷地改善、修正并提升图片质量,让照片看起来更为出色且引人注目。无论你是日常使用者还是专业的摄影人士,都能够借助这款应用来增强照片的表现力,让它们更具吸引力。一、下载......
  • 四边形不等式 学习笔记
    四边形不等式学习笔记定义四边形不等式(QI)如果对于函数\(w(l,r)\),\(l_1\lel_2\ler_1\ler_2,w(l_1,r_1)+w(l_2,r_2)\lew(l_1,r_2)+w(l_2,r_1)\),则称\(w\)满足四边形不等式,函数\(w\)的二维矩阵被称作蒙日矩阵。一般只能用于求\(\min\)的DP。石子合并模型对......
  • Adobe Premiere Pro 2023 激活版下载安装教程
    前言AdobePremierePro(简称PR)是一款知名的专业视频编辑软件,数字视频剪辑软件。主要用来编辑视频和音频,可以在RGB和YUV色彩空间中以高达32位色彩的视频分辨率对4K和更高质量的视频文件进行编辑,支持VST音频插件和音轨5.1环绕声,支持沉浸式360/VR视频,基于非线性编辑的软件。Premiere......
  • CF1826D
    CF1826D链接:Problem-1826D-Codeforces题目大意:给你一个数组,让你选择一个区间\([l,r]\)设选中的区间为\(b\),\(b_{i_1}+b_{i_2}+b_{i_3}\)为区间内前三大的值,你需要选择一个区间使得\(b_{i_1}+b_{i_2}+b_{i_3}-(r-l)\)值最大,输出最大值思路:我们发现......
  • CyberLink PowerDVD v23 激活版下载及安装教程
    前言CyberLinkPowerDVD是一款全球专业蓝光影音播放软件,新版全新64位播放引擎,改进了8K超清视频播放、更高分辨率高清视频处理,同时4K视频后期处理还新增了色彩校正、对比度增强、HDR等。另外,新版支持HEIC/HEIF图像格式,播放HDR视频时不再影响桌面HDR控制,改进了VRHMD播放规范,360度......
  • Gradio.NET 8 简化 Web 应用开发
    Gradio.NET支持.NET8简化Web应用开发 合集-.NET开源工具(7) 1..NET开源快捷的数据库文档查询和生成工具07-312..NET结果与错误处理利器FluentResults08-013..NET+WPF桌面快速启动工具GeekDesk08-194.Gradio.NET支持.NET8简化Web应用开发08-265..N......