需求
项目于5月份上线支持。但是从3月份开始,公司就开展了实践,用Excel和文档来记录了两个月的相关数据。而且数据库的表之间是有关联关系的,并且是以数据库表自增的主键关联起来。现在需要把这两个月的数据导入到生产环境数据库,生产环境数据库只能运维的同事维护,不能自己做改动。
具体情况描述(以用户角色为例)
- 业务部门给的excel表格如下:
- 数据库表结构如下
- 要求:
根据excel的信息将用户信息以及用户角色信息导入到数据库中。
解决方案
1、借助于java代码和临时表来实现,适用于大规模多次的导入。
方案流程图:
- 在开发数据库中创建一个与Excel表格中字段一直的excel_temp临时表用来存储从excel中读取的数据。因为excel中的数据会比较杂乱,这一层起到了过滤的作用。不要读Excel后直接存储到开发环境的user和user_role表中,这样不好处理,出了问题难以定位。
- 通过java代码写逻辑,将数据从excel_temp表中获取,然后将数据根据用户角色规则插入到user和user_role表中。
- 数据已经存储到两张表中了。由于user_role和user是用主键进行关联的,那么如果直接用本来的主键,到生产中就很有可能与生产环境中原本数据的主键冲突。
- 于是,我们在生产环境中多建了1:1的两张临时表user_temp,user_role_temp,这样以便将我们上述步骤生成的数据输入到生产环境数据库中。
- 然后通过java代码,将数据转移到user和user_role表中。这样就不会出现主键重复的问题了。
2、方法较为简单,适合关联关系较简单的数据库
- 笔者依旧使用了java代码获取了excel数据并存储到excel_temp临时表中。
- 还是用excel_temp表的数据注入到开发环境数据库的user表中。
- user表的数据是初始值,所以只要插入user信息后续通过唯一的user_account就可以获取主键user_id。
- 于是就可以导出user数据,手动将主键字段去掉,直接可以插入到生产环境中。
- 而通过java代码查询excel_temp表就可以批量生成添加数据到user_role的sql语句。
INSERT INTO user_role(user_id,role_id,role_name)VALUES((SELECT user_id FROM user WHERE user_account = '10061***'),1,'管理员');
- 这样比上一种方法较为简单,也符合需求。
其实该项目的表应该直接以user_account这个唯一值来关联上述的两张表,这样的设计才合理。吸取教训。
注
- 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
- 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。