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 结果集的记录。
注意:删除操作不可逆,建议做好备份,做到事务原子性与数据一致性。