mysql使用模板解决旧数据处理,默认初始化数据的通用方法!
一 业务介绍
先来看看我这得大致业务需求,这次业务比较简单:
即从现在开始,每次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使用模板解决旧数据处理,默认初始化数据的通用方法!的更多相关文章
- mysql mysqldump只导出表结构或只导出数据的实现方法
mysql mysqldump只导出表结构或只导出数据的实现方法,需要的朋友可以参考下. mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt ...
- [MFC]解决回车键 ESC 默认关闭窗口的一般方法
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上, ...
- 解决设置select默认选中不生效的方法
$scope.storageTypeList = ['Glusterfs','NFS','Ceph']; 不生效的方法: <select class="form-control&quo ...
- Oracle GoldenGate从oracle db 到非oracle db的初始化数据同步的方法
非oracle db以 sqlserver为样例说明: 我的思路 A :oracle db 生产 B: oracle db 中间机 C: sqlserver db 目的端 A-> B-> ...
- mysql学习之-密码管理(默认密码,修改密码,解决忘记密码)
1. mysql安装后默认没有密码,初始化安装后默认密码登录,需要马上修改root密码.[root@mysql ~]# cat /root/.mysql_secret --查看root账号密码# ...
- 使用mysql悲观锁解决并发问题
最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...
- 使用mysql乐观锁解决并发问题
案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为1000 ...
- 使用mysql乐观锁解决并发问题思路
本文摘自网络,仅供个人学习之用 案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...
- MySQL使用可重复读作为默认隔离级别的原因
一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR). ...
随机推荐
- 如何杀掉Monkey测试
1.adb shell 2.ps | grep monkey 3.kill pid 然后可以看到手机进程中的monkey进程被杀死了,再执行ps | grep monkey,就会发现没有monkey进 ...
- .net MVC4 来一个简单的分页代码
action VodeEntities db = new NewVode.Models.VodeEntities(); ; ) { var sql = "select * ,row_numb ...
- UVAlive4080_Warfare And Logistics
给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...
- SourceTree轻松Git项目
这篇文档的目的是:让使用Git更轻松. 看完这篇文档你能做到的是: 1.简单的用Git管理项目. 2.怎样既要开发又要处理发布出去的版本bug情况. SourceTree是一个免费的Git图形化管理工 ...
- [二十七]SpringBoot 之 Restful接口的跨域请求
什么是跨域 简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求.比如说,前端域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑,访问www.xyz. ...
- BZOJ5288 HNOI/AHOI2018游戏
首先将之间没有锁的房间合并.显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a). 考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间.如果能求出这个,对此建两棵树,问 ...
- 在OpenShift上托管web.py应用
一.背景 最近在学习web.py,跟随官网的cookbook和code examples一路敲敲打打,在本地访问了无数遍http://0.0.0.0:8080/,也算是对web.py有了基本的认识.为 ...
- java之初学线程
线程 学习线程相关的笔记,前面写过关于很多线程的使用,有兴趣的可以去了解下 线程 概念理解 并发 : 指两个或多个事件在同一个时间段内发生(交替执行). 并行 : 指两个或多个事件在同一时刻发生(同时 ...
- Android热点回顾第六期
Android热点回顾第五期 http://www.importnew.com/9274.html Android热点回顾第四期http://www.importnew.com/8997.html A ...
- bzoj 3853 : GCD Array
搬运题解Claris:1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ $\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=& ...