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

 

在 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规则(需在数据库表设计中定义)。

 级联删除:https://www.cnblogs.com/warmNest-llb/p/18393695 

 

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 结果集的记录。

 

 

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

 

 


 

posted @ 2024-09-01 21:42  学Java的`Bei  阅读(120)  评论(1编辑  收藏  举报