MySQL数据库,有三张表:
- template表记录模板基本信息。
- category表保存所有的模板分类信息。
- template_category表记录模板和分类的关系,通过id关联,template和category是多对多的关系。
之前代码有bug导致创建了很多重复的模板分类(name一样但id不一样),并且每个模板分类下都可能分布了一些这个分类对应的模板(在template_category表有对应的记录)。
例如:
分类表数据
id name deleted_at
----------------------------
1 CRM 2021-07-05 14:51:22.006
2 CRM 2021-07-06 16:05:22.882
3 CRM <null>
4 OA 2021-07-05 14:51:22.006
5 OA <null>
template表数据
id other_fields
----------------------------
1
2
3
...
tempalte_category表数据
template_id category_id
----------------------------
1 1
2 2
3 3
...
现在修复了bug,想用sql命令整理旧的错误数据。期望把名字相同的模板分类合并到同名未被删除的那一个,即整理为以下效果:
tempalte_category表数据
template_id category_id
----------------------------
1 3
2 3
3 3
不知有何方案?
动数据库之前要三思,像事务那样把所有操作考虑清楚了再一起动手。
在删除重复category的时候就应该同步修改关联表了,每delete一个category,就把所有引用它的地方修改成保留值。
用编程语言通过循环遍历把最后一步补上是最简单的,非要用SQL的话,不要在生产环境执行(不保证下面的语句没问题,自己在测试环境多试试),先备份表出来,执行完检查无误再同步回去: