一 业务介绍

先来看看我这得大致业务需求,这次业务比较简单:

即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干个孙子(爸爸表的子表,爸爸id关联),

这么说可能比较绕,综艺就是在爷爷表插入一条数据的同时,往父表插入固定的几条记录,然后往父表插入每条记录的同时再往儿子表插入固定的记录,之间都是用主键关联,表名分别是:

爷爷 :   pm_project

爸爸:    pm_role      (project_id  关联爷爷)

儿子:    pm_role_app    ()role_id 关联爸爸,同时project_id再关联爷爷)

需要new的儿子的模板表:pm_project_app_filter, 因为业务需要,孙子模板放在单独的表中,爸爸模板放在自己表中,爷爷id设为-1.

二   初始化父表

我们先不考虑java在新建爷爷时的处理方式,来看旧爷爷的处理.

首先准备爸爸的模板,即new一个爷爷时,需要初始化爸爸是几个,分别有什么具体要求,那么可以直接在爸爸表里建立业务需要的模板,只需要将爷爷id设置为-1即可:

如图,有了这三个模板之后,我们就可以先给每个旧的爷爷三个他们的儿子,这里采用笛卡尔积批量插入处理:

insert into pm_role (id,role_code,role_name,project_id,is_del)
(select
lpad(UUID_SHORT(),32,UUID_SHORT()),
t2.role_code,
t2.role_name,
t1.id,
t2.is_del
FROM pm_project t1,pm_role t2 where t2.project_id="-1");

即关联爷爷和爸爸表,然后筛选出爷爷id=-1的三个模板儿子,与爷爷表中每个爷爷产生笛卡尔积,给每个爷爷三个儿子,完成,注意,

这里主键采用lpad函数,不建议使用UUID,原因是有的mysql引擎性能如果过于强大就会报错,因为速度太快,造成主键重复,来不及随机

三 初始化子表

再来看孙子表中需要的模板,处于特殊业务需求,这里孙子表的某个字段需要的数据采用另一张表的模板存储:

即孙子表每个孙子都需要一个app_id,也就是说,每个爸爸有三个不同app_id的儿子,这个根据业务可以随意调整,然后初始化:

insert into pm_role_app(
id,
project_id,
role_id,
app_id,
data_scope
)
select
lpad(UUID_SHORT(),32,UUID_SHORT()),
t1.project_id,
t1.id,
t2.app_id,
case when t2.app_id="46d577d4dcb344b583e7254dee3d6dba" then 3 else 1 END

FROM pm_role t1,pm_project_app_filter t2 where t1.project_id!="-1";

这时候关联爸爸表和这个模板表,并排除爸爸表中的模板 ,然后给每个爸爸都生成三个带有模板app_id的儿子,就可以了,这里也采用批量插入.

四  新建爷爷时处理的逻辑

这里主要就是按照业务写代码就可以了,没什么要说的,直接贴代码:

保存爷爷:

dao.save(pMProject);
pmRoleService.init(pMProject.getId());//用爷爷id,保存三个爸爸

保存爸爸:

保存儿子:

,

这样,以后如果要多的每次需要多的儿子或者爸爸,只需要在模板表中添加一条记录,或者在常量类中多配置一个爸爸模板即可,便于后期维护扩展,sql的初始化语句也可以通用!

mysql使用模板解决旧数据处理,默认初始化数据的通用方法!的更多相关文章

  1. mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump只导出表结构或只导出数据的实现方法,需要的朋友可以参考下. mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt ...

  2. [MFC]解决回车键 ESC 默认关闭窗口的一般方法

    在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上, ...

  3. 解决设置select默认选中不生效的方法

    $scope.storageTypeList = ['Glusterfs','NFS','Ceph']; 不生效的方法: <select class="form-control&quo ...

  4. Oracle GoldenGate从oracle db 到非oracle db的初始化数据同步的方法

    非oracle db以 sqlserver为样例说明: 我的思路 A :oracle db 生产  B: oracle db 中间机 C: sqlserver db 目的端 A-> B-> ...

  5. mysql学习之-密码管理(默认密码,修改密码,解决忘记密码)

    1. mysql安装后默认没有密码,初始化安装后默认密码登录,需要马上修改root密码.[root@mysql ~]# cat /root/.mysql_secret    --查看root账号密码# ...

  6. 使用mysql悲观锁解决并发问题

    最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...

  7. 使用mysql乐观锁解决并发问题

    案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为1000 ...

  8. 使用mysql乐观锁解决并发问题思路

    本文摘自网络,仅供个人学习之用 案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...

  9. MySQL使用可重复读作为默认隔离级别的原因

    一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR). ...

随机推荐

  1. 如何杀掉Monkey测试

    1.adb shell 2.ps | grep monkey 3.kill pid 然后可以看到手机进程中的monkey进程被杀死了,再执行ps | grep monkey,就会发现没有monkey进 ...

  2. .net MVC4 来一个简单的分页代码

    action VodeEntities db = new NewVode.Models.VodeEntities(); ; ) { var sql = "select * ,row_numb ...

  3. UVAlive4080_Warfare And Logistics

    给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...

  4. SourceTree轻松Git项目

    这篇文档的目的是:让使用Git更轻松. 看完这篇文档你能做到的是: 1.简单的用Git管理项目. 2.怎样既要开发又要处理发布出去的版本bug情况. SourceTree是一个免费的Git图形化管理工 ...

  5. [二十七]SpringBoot 之 Restful接口的跨域请求

    什么是跨域 简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求.比如说,前端域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑,访问www.xyz. ...

  6. BZOJ5288 HNOI/AHOI2018游戏

    首先将之间没有锁的房间合并.显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a). 考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间.如果能求出这个,对此建两棵树,问 ...

  7. 在OpenShift上托管web.py应用

    一.背景 最近在学习web.py,跟随官网的cookbook和code examples一路敲敲打打,在本地访问了无数遍http://0.0.0.0:8080/,也算是对web.py有了基本的认识.为 ...

  8. java之初学线程

    线程 学习线程相关的笔记,前面写过关于很多线程的使用,有兴趣的可以去了解下 线程 概念理解 并发 : 指两个或多个事件在同一个时间段内发生(交替执行). 并行 : 指两个或多个事件在同一时刻发生(同时 ...

  9. Android热点回顾第六期

    Android热点回顾第五期 http://www.importnew.com/9274.html Android热点回顾第四期http://www.importnew.com/8997.html A ...

  10. bzoj 3853 : GCD Array

    搬运题解Claris:1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ $\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=& ...