• mysql处理旧数据-使用模板以及临时表,不建议直接使用本表!!


    一 业务背景新版本中新建了一个项目的角色表,即每个项目都拥有几个角色,原来历史项目是没有角色的,这就要求使用脚本对表中的历史项目进行处理,

    业务需求:每个项目都要有三个角色:

    表 : 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 into pm_role_temp (id,role_code,role_name,project_id,is_del,order_num) 
    (select 
    lpad(UUID_SHORT(),32,UUID_SHORT()),
    t2.role_code,
    t2.role_name,
    t1.id,
    t2.is_del,
    t2.order_num
    FROM pm_project t1,pm_role t2 where t2.project_id="-1");
    
    insert into pm_role(select * from pm_role_temp);
    
    DROP TABLE pm_role_temp;

    先把数据插入到临时表中,再插入到角色表中,最后删除临时表!

    这很简单,但是有个大坑,因为图省事,刚开始用了本表,即直接用角色表关联,自己开发库和测试库都没问题,但是最后生产库就是有问题,排序都是1,所以保险起见,还是用临时表,记录一下!

    这种情况在UUID() 和lpad()上也吃过亏,建议大家以后都用lpad(),然后如果有二级直属,即角色表中每个角色还有固定的应用什么的,继续临时表就可!

  • 相关阅读:
    使用 RetroShare 分享资源
    C# 代码占用的空间
    C# 代码占用的空间
    PHP date_timezone_set() 函数
    PHP date_timezone_get() 函数
    PHP date_timestamp_set() 函数
    PHP date_timestamp_get() 函数
    PHP date_time_set() 函数
    MHA软件下载地址
    [ZJOI2019]线段树
  • 原文地址:https://www.cnblogs.com/houzheng/p/8967710.html
Copyright © 2020-2023  润新知