需求描述:

在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便。

例如:公司某一个系统的库有三百张表,在不熟悉项目的情况下,打开数据库看到一列列的表,很不清晰,对新入职同事很不友好。


需求分析:

我们一个系统里,可能有很多个模块,例如商城系统中有商品模块、券模块、店铺模块等,没个模块都有几十张表,每个模块需要生成如下关系图:(吐槽一下,Navicat逆向的图没PowerDesigner好看)


技术方案:

使用工具:Navicat

Navicat是国内的一款数据库客户端,内置有模型功能,可以实现需求中,选中一个模块的所有表,逆向表到模型,从而生成ER图,但如果选中表中,没有外键关联,生成出来的模型,并没有像需求中那样,有直观的线连接,所以需要给对应表生成外键SQL。

从Navicat中选中所有表导出为SQL时发现下图规律


解决方案:

1. 把每个表语句拆分出来

2. 主表与关联表,主表不需要生产外键,关联表可以通过小撇号判断是否需要外键

3. 说再多文字不如读一遍代码更清晰

package com.example.demo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;public class MysqlERGenerate {public static void main(String[] args) throws IOException {StringBuilder builder = new StringBuilder();// 输入从Navicat导出的表结构sql文件 将文件读取出来 放入字符串中InputStream is = Files.newInputStream(Paths.get("C:\\Users\\admin\\Desktop\\ddl.sql"));String line;BufferedReader reader = new BufferedReader(new InputStreamReader(is));line = reader.readLine();while (line != null) {builder.append(line);builder.append("\n");line = reader.readLine();}reader.close();is.close();String sql = builder.toString();// 按照规律 使用CREATE TABLE进行分割 并删掉一个文件注释部分String[] split = sql.split("CREATE TABLE");List<String> list = new ArrayList<>(Arrays.asList(split));list.remove(0);// 使用开头两个小撇号进行截取 得到表名 转为Map<表名, SQL>Map<String, String> collect = list.stream().collect(Collectors.toMap(k -> {int firstIndex = k.indexOf("`");return k.substring(++firstIndex, k.indexOf("`", firstIndex));}, v -> v));// 需要创建外键的字段与对应的主表名称 Map<外键名, 外键主表名>Map<String, String> foreignKey = new HashMap<>();foreignKey.put("ticket_no", "ticket");foreignKey.put("ticket_define_no", "ticket_define");foreignKey.put("pro_no", "pro_main");// 循环判断,生成外键SQLSet<String> foreignKeyFields = foreignKey.keySet();for (String mainTableName : collect.keySet()) {String val = collect.get(mainTableName);for (String field : foreignKeyFields) {if (!mainTableName.equals(foreignKey.get(field)) && val.indexOf("`" + field + "`") > 0) {String createForeignKeySql = String.format("alter table %s add foreign key %s(%s) references %s(%s);", mainTableName, mainTableName + field + System.currentTimeMillis(), field, foreignKey.get(field), field);System.out.println(createForeignKeySql);}}}}
}

运行效果:只复制出部分,实际远比这个多

alter table pro_param add foreign key pro_parampro_no1650765563395(pro_no) references pro_main(pro_no);
alter table pro_shop_priority_his_20200805 add foreign key pro_shop_priority_his_20200805pro_no1650765563423(pro_no) references pro_main(pro_no);alter table ticket_define_shop add foreign key ticket_define_shopticket_define_no1650765563423(ticket_define_no) references ticket_define(ticket_define_no);
alter table ticket_define_item add foreign key ticket_define_itemticket_define_no1650765563425(ticket_define_no) references ticket_define(ticket_define_no);alter table ticket_his_2019 add foreign key ticket_his_2019ticket_no1650765563432(ticket_no) references ticket(ticket_no);
alter table ticket_his_2018 add foreign key ticket_his_2018ticket_no1650765563433(ticket_no) references ticket(ticket_no);

PS:原创,码字不易,转发请标明出处

  1. 外键语句不要去开发测试生产等环境执行,要自己在本地新建库
  2. 新建库时,只转结构就好,不然数据多了,外键语句执行特慢
  3. 结束后,想要那些表之间的关系图,只需要选中后逆向表到模型即可得到需求中的效果
  4. 切记第一点

快速生成 MySQL 数据库关系图相关推荐

  1. 在线数据库关系图设计工具 dbdiagram.io

    dbdiagram.io是holistics.io这款商业产品的社区版.是一款在线关系型数据库ER图设计系统,特点: 使用DSL语言,可以简单快速地创建数据库关系图: Online :不需要安装软件, ...

  2. visio连接mysql数据库表_「数据库关系图」使用Visio 2010 画数据库中表与表的关系 - seo实验室...

    数据库关系图 1.在visio中新建数据库模型图 打开visio 2010,文件->新建->数据库->数据库模型图.建立数据库模型图之后,菜单栏多出一个菜单项"数据库&qu ...

  3. mysql 关系图 工具_DbSchema(数据库关系图设计器) V8.1.7 官方版

    DbSchema 是一款专业可靠的数据库关系图设计软件,你可以通过拖放或按外键图标添加表格,并具有多种过滤器,数据排序机制等等.可通过多个数据库管理和同步模式使用可帮助您设计,记录和管理数据库,轻松设 ...

  4. mysql的关系图_学会sql数据库关系图

    很久以前就知道微软的Petshop的很经典,昨天抽出时间去学习,一开始还真的不适应,什么成员资格,还真的看不太懂,运行petshop想从登陆学起,但是用户名和密码都不知道,后来发现有更注册的页面,自己 ...

  5. mysql新建数据库关系图_创建数据库关系图失败解决方法

    本文章介绍了关于创建数据库关系图失败解决方法,有需要的同学可以参考一下下. 在新建或附加数据库后,想添加关系表,结果出现下面的错误: 此数据库没有有效所有者,因此无法安装数据库关系图支持对象.若要继续 ...

  6. 封装mysql数据库_快速掌握 Mysql数据库对文件操作的封装

    快速掌握 Mysql数据库对文件操作的封装 在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open.close.seek等,在Win32下的文件和目录 ...

  7. 【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 数据库是如何解决数据存储问题的 1. 表的相关数据 2. create tab ...

  8. SQL Server数据库关系图和数据库中数据的操作(添加,查询,修改,删除)

    文章目录 一.创建数据库关系图 二.数据的操作 1.添加数据 (1) 添加单行数据 (2) 添加多行数据 2.简单查询数据 3.修改数据 4.删除数据 5.还原数据表 三.数据库的设计 1.主键的选择 ...

  9. 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库

    使用MySQL自带工具mysqlhotcopy快速备份mysql数据库 发表于82 天前 ⁄ 网站备份 ⁄ 暂无评论 mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供.它 ...

最新文章

  1. Shell---for循环
  2. 字节跳动客户开发_实习|字节跳动 客户端实习生 1-5面 面经
  3. peleenet v2不好
  4. 也许你不知道的c#基本数据类型及其默认值
  5. PowerShell删除Exchange 2010邮件的正确姿势
  6. CMU预训练模型最新综述:自然语言处理新范式—预训练、Prompt和预测
  7. Java秒杀系统优化的工程要点
  8. struts基本概念(2)
  9. 信息学奥赛一本通 1003:对齐输出 | OpenJudge NOI 1.1 03
  10. php 启动管理工具下载,PHP管理工具compser windows下安装
  11. EMNLP 2021 投稿FAQ
  12. python的标准库——turtle
  13. pycharm右侧显示代码缩略图/预览 CodeGlance
  14. python 文本替换 速度_python 实现批量替换文本中的某部分内容
  15. 微信小程序之组件的四种传值方式
  16. 电脑版微信防撤回大全
  17. 关于AndroidStudio3.0以上(3.2bate)创建.9patch图片出错的问题
  18. 【FOMO3d】 的隐藏彩(lou)蛋(dong)
  19. 深度探索C++对象模型笔记
  20. CFileDialog文件对话框

热门文章

  1. Stable Diffusion 深度图像库插件使用小记
  2. 大白话概念---树的高度和深度
  3. matlab dmod函数下载,matlab dmod函数下载
  4. 论文最后一个尾注和参考文献、致谢混在一起?
  5. 【openCV】matlab中bwareaopen和bwmorph(src, 'thin', Inf)opencv下的实现
  6. Cloudinit简介
  7. 2018年网易实习生笔试题集合之矩形重叠
  8. 多台Ubuntu系统电脑使用ntp时间同步
  9. MD5加密中文结果不一致
  10. 我与传智播客的不解之缘