快速生成 MySQL 数据库关系图
需求描述:
在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对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:原创,码字不易,转发请标明出处
- 外键语句不要去开发测试生产等环境执行,要自己在本地新建库
- 新建库时,只转结构就好,不然数据多了,外键语句执行特慢
- 结束后,想要那些表之间的关系图,只需要选中后逆向表到模型即可得到需求中的效果
- 切记第一点
快速生成 MySQL 数据库关系图相关推荐
- 在线数据库关系图设计工具 dbdiagram.io
dbdiagram.io是holistics.io这款商业产品的社区版.是一款在线关系型数据库ER图设计系统,特点: 使用DSL语言,可以简单快速地创建数据库关系图: Online :不需要安装软件, ...
- visio连接mysql数据库表_「数据库关系图」使用Visio 2010 画数据库中表与表的关系 - seo实验室...
数据库关系图 1.在visio中新建数据库模型图 打开visio 2010,文件->新建->数据库->数据库模型图.建立数据库模型图之后,菜单栏多出一个菜单项"数据库&qu ...
- mysql 关系图 工具_DbSchema(数据库关系图设计器) V8.1.7 官方版
DbSchema 是一款专业可靠的数据库关系图设计软件,你可以通过拖放或按外键图标添加表格,并具有多种过滤器,数据排序机制等等.可通过多个数据库管理和同步模式使用可帮助您设计,记录和管理数据库,轻松设 ...
- mysql的关系图_学会sql数据库关系图
很久以前就知道微软的Petshop的很经典,昨天抽出时间去学习,一开始还真的不适应,什么成员资格,还真的看不太懂,运行petshop想从登陆学起,但是用户名和密码都不知道,后来发现有更注册的页面,自己 ...
- mysql新建数据库关系图_创建数据库关系图失败解决方法
本文章介绍了关于创建数据库关系图失败解决方法,有需要的同学可以参考一下下. 在新建或附加数据库后,想添加关系表,结果出现下面的错误: 此数据库没有有效所有者,因此无法安装数据库关系图支持对象.若要继续 ...
- 封装mysql数据库_快速掌握 Mysql数据库对文件操作的封装
快速掌握 Mysql数据库对文件操作的封装 在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open.close.seek等,在Win32下的文件和目录 ...
- 【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)
课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 数据库是如何解决数据存储问题的 1. 表的相关数据 2. create tab ...
- SQL Server数据库关系图和数据库中数据的操作(添加,查询,修改,删除)
文章目录 一.创建数据库关系图 二.数据的操作 1.添加数据 (1) 添加单行数据 (2) 添加多行数据 2.简单查询数据 3.修改数据 4.删除数据 5.还原数据表 三.数据库的设计 1.主键的选择 ...
- 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库
使用MySQL自带工具mysqlhotcopy快速备份mysql数据库 发表于82 天前 ⁄ 网站备份 ⁄ 暂无评论 mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供.它 ...
最新文章
- Shell---for循环
- 字节跳动客户开发_实习|字节跳动 客户端实习生 1-5面 面经
- peleenet v2不好
- 也许你不知道的c#基本数据类型及其默认值
- PowerShell删除Exchange 2010邮件的正确姿势
- CMU预训练模型最新综述:自然语言处理新范式—预训练、Prompt和预测
- Java秒杀系统优化的工程要点
- struts基本概念(2)
- 信息学奥赛一本通 1003:对齐输出 | OpenJudge NOI 1.1 03
- php 启动管理工具下载,PHP管理工具compser windows下安装
- EMNLP 2021 投稿FAQ
- python的标准库——turtle
- pycharm右侧显示代码缩略图/预览 CodeGlance
- python 文本替换 速度_python 实现批量替换文本中的某部分内容
- 微信小程序之组件的四种传值方式
- 电脑版微信防撤回大全
- 关于AndroidStudio3.0以上(3.2bate)创建.9patch图片出错的问题
- 【FOMO3d】 的隐藏彩(lou)蛋(dong)
- 深度探索C++对象模型笔记
- CFileDialog文件对话框