一 业务背景新版本中新建了一个项目的角色表,即每个项目都拥有几个角色,原来历史项目是没有角色的,这就要求使用脚本对表中的历史项目进行处理,
业务需求:每个项目都要有三个角色:
表 : pm_project 项目表
pm_role 项目角色表
具体业务比较复杂,这里只考虑历史项目的直属角色的初始化,不考虑二级直属等等.
思路是准备固定的角色模板数据,然后与项目表关联产生笛卡尔积,最后插入;
二 sql
首先准备模板数据:
/*-- 准备模板默认角色 --*/
insert into pm_role (id,role_code,role_name,project_id,is_del,order_num) values(LPAD(UUID_SHORT(),32,UUID_SHORT()),"XMJL_0","项目经理","-1",0,1);insert into pm_role (id,role_code,role_name,project_id,is_del,order_num) values(LPAD(UUID_SHORT(),32,UUID_SHORT()),"GSSHR_0","工时审核人","-1",0,3);insert into pm_role (id,role_code,role_name,project_id,is_del,order_num) values(LPAD(UUID_SHORT(),32,UUID_SHORT()),"XMCY_0","项目成员","-1",0,2);
然后,创建临时表,注意,这里必须要使用临时表,否则如果直接用本表关联的话,一起执行速度快的话会导致order_num排序字段都是1,分开执行就没问题,这里类似于UUID() 与lpad()的区别,建议都使用lpad,这里也是一样的
/*-- 准备临时表 --*/
CREATE TABLE pm_role_temp like pm_role;/*--初始化角色--*/
insert intopm_role_temp (id,role_code,role_name,project_id,is_del,order_num)
(selectlpad(UUID_SHORT(),32,UUID_SHORT()),
t2.role_code,
t2.role_name,
t1.id,
t2.is_del,
t2.order_numFROM pm_project t1,pm_role t2 where t2.project_id="-1");insert into pm_role(select * frompm_role_temp);DROP TABLE pm_role_temp;
先把数据插入到临时表中,再插入到角色表中,最后删除临时表!
这很简单,但是有个大坑,因为图省事,刚开始用了本表,即直接用角色表关联,自己开发库和测试库都没问题,但是最后生产库就是有问题,排序都是1,所以保险起见,还是用临时表,记录一下!
这种情况在UUID() 和lpad()上也吃过亏,建议大家以后都用lpad(),然后如果有二级直属,即角色表中每个角色还有固定的应用什么的,继续临时表就可!