MySql查询之删除多张关联表的数据(依据其中一张表的id)

 

DELETE t1,t2 from t1 LEFT JOIN t2 ONt1.id=t2.id WHERE t1.id=25

 

注意点如下:

1,不能直接DELETE FROM t1 left join t2....,必须在delete之后加上关联的表

2,注意此处的delete t1,t2 from 中的t1,t2不能是别名

如:delete t1,t2 from table_name as t1left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本不小于5.0在5.0中是可以的)

### MySQL 中实现分页查询删除记录 在MySQL中,为了安全性和事务一致性,在执行分页查询的同时直接删除记录并不是推荐的做法。然而,可以通过多步操作来间接完成这一目标。首先,使用 `LIMIT` 和 `OFFSET` 子句进行分页查询以定位待删除数据集;其次,在确认无误的情况下批量删除这些记录。 #### 使用临时存储待删除ID 一种较为稳健的方法是先创建一个临时保存即将被删除的记录ID: ```sql CREATE TEMPORARY TABLE temp_ids AS ( SELECT id FROM your_table ORDER BY some_column LIMIT ${pageSize} OFFSET ${offset} ); ``` 接着可以基于此临时来进行实际的删除动作: ```sql DELETE FROM your_table WHERE id IN (SELECT id FROM temp_ids); DROP TEMPORARY TABLE IF EXISTS temp_ids; ``` 这种方法确保了即使中途出现问题也能回滚到之前的状态,减少了因并发访问或其他异常情况带来的风险[^1]。 #### 利用子查询一次性完成 对于某些特定场景下,也可以考虑利用单个SQL语句结合子查询的方式来达到目的,但这可能会影响性能并且增加了复杂度: ```sql DELETE FROM your_table WHERE id IN ( SELECT t.id FROM ( SELECT id FROM your_table ORDER BY some_column LIMIT ${pageSize} OFFSET ${offset} ) as t ); ``` 需要注意的是上述方法中的子查询部分必须再嵌套一层才能正常工作,这是因为MySQL不允许在同一张上同时做读写操作[^4]。 #### Java代码示例配合MyBatis框架 当涉及到Java应用程序时,建议采用编程方式控制整个流程,并且最好是在同一个事务内完成所有相关联的操作。这里给出一段简单的伪代码作为参考: ```java @Transactional public void deleteUsersInBatch(int pageNumber, int pageSize){ // 获取当前页面对应的用户IDs List<Integer> userIds = userMapper.getUserIdsForDeletion(pageNumber, pageSize); if (!userIds.isEmpty()){ // 执行批量删除 userMapper.deleteUsersByIdList(userIds); } } @Mapper interface UserMapper { @Select("<script>" + "SELECT id FROM users " + "<where>" + "/* 条件 */" + "</where>" + "ORDER BY create_time DESC " + "LIMIT #{pageSize} OFFSET #{offset}" + "</script>") List<Integer> getUserIdsForDeletion(@Param("pageNumber") int pageNumber,@Param("pageSize") int pageSize); @Delete("<script>" + "DELETE FROM users " + "<foreach item='id' collection='list' open='WHERE id IN (' separator=',' close=')'>" + "#{id}" + "</foreach>" + "</script>") void deleteUsersByIdList(List<Integer> ids); } ``` 这段代码展示了如何在一个事务范围内先后调用了两个映射器接口函数——先是选取一批用户的ID,之后依据这批ID实施删除操作。这种方式既保持了逻辑上的清晰又兼顾到了效率问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值