场景
老板一句话:“把手机号 1381234**** 开头的用户全部清掉!”
我们写了 4 条 delete,再套上事务,就像拆积木一样,一拆到底。
但顺序错了会报错或留下垃圾数据,今天用大白话讲明白。
先删子,再删父

4 步操作速览
| 步骤 | 目标表 | 删除条件 | 删除内容 | 必须排第几步? |
|---|---|---|---|---|
| ① | order_item | 订单号在 1381234 用户的订单里 | 订单明细 | 第1️⃣ 步(子表) |
| ② | orders | 用户手机 1381234% | 订单 | 第2️⃣ 步 |
| ③ | coupon | 同上 | 优惠券 | 第3️⃣ 步 |
| ④ | user | 同上 | 用户本人 | 第4️⃣ 步(根表) |
为什么要包一层事务?
| 事务关键词 | 大白话解释 |
|---|---|
start transaction | 开工! |
commit | 全部成功,盖章生效 |
rollback | 中途出错,一键撤销,谁也不吃亏 |
顺序写错的后果
| 错误顺序示例 | 当场后果 |
|---|---|
先删 user | 子表 orders 还引用它 → 外键报错 ❌ |
先删 orders | order_item 还引用 orders → 依旧报错 ❌ |
正确完整代码
start transaction; -- 1️⃣ 删订单明细 delete from order_item where order_id in ( select o.id from orders o join user u on u.id = o.user_id where u.phone like '1381234%' ); -- 2️⃣ 删订单 delete from orders where user_id in ( select id from user where phone like '1381234%' ); -- 3️⃣ 删优惠券 delete from coupon where user_id in ( select id from user where phone like '1381234%' ); -- 4️⃣ 删用户 delete from user where phone like '1381234%'; commit;
一句话总结
先拆子,再拆父,事务兜底,顺序不乱,数据就干净!
总结
到此这篇关于mysql一条sql清理用户的4步操作步骤的文章就介绍到这了,更多相关mysql sql清理用户内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论