Fork me on GitHub

【MySQL表比较工具】比较不同MySQL数据库的表结构差异

一、需求来源

来源,其实也是自己开发的时候用到的。哈哈,公司交代了一个项目给我全权处理,也就是说我要设计数据库,写接口文档,参与开发,分配任务等等。

身边的开发人员项目经验比较少,于是我就上去主导项目了。后面带领团队一两周,到了测试环境预备的阶段。此时,我的数据库还没有完全设计完成。于是,我就把开发的数据库脚本导出到测试环境的数据库。

这样一来,问题就出来了。我如果修改了开发环境的表结构,还得同步测试环境。本来觉得手多操作一遍是可以的,但是人终究会犯错的。偶尔,修改开发表结构的时候,被其他事情打断了,我就忘记同步到测试环境。久而久之,两边的表结构就产生了很大的差异。全部清空吧,一百来张表,说多不多,说少也不少。

于是,我萌生了一种自己写一个跨库表比较工具的念头。

 

二、设计思路

1、获取数据库A和数据库B的所有表信息。

2、先进行表数量的比较 -> 获取出数据库A比数据库B少的表,数据库B比数据库A少的表。

3、遍历数据库A的每个表信息,获取每个表的字段信息

4、遍历数据库B的每个表信息,获取每个表的字段信息

5、进行字段数量的比较 -> 获取出数据库A的表比数据库B的表少的字段,数据库B的表比数据库A的表少的字段。

6、进行字段的详细比较 -> 获取出数据库A的表比数据库B的表字段不一样的比较(比如类型、索引、比较规则、字符格式、数字精度、注释等等),数据库B的表比数据库A的表字段不一样的比较

 

问题1:如何获取数据库下的所有表信息

回答:可以通过show tables;获取

问题2:如何获取表的所有字段信息

回答: a.通过show create table [表名];可以获取建表语句,不好处理,不满足我的需求。

    b.通过desc [表名];可以获取表结构的一些基本信息,但无法获取字段的注释等更详细的信息,不满足我的需求。

       c.通过select * from information_schema.COLUMNS where TABLE_SCHEMA = [库名] and TABLE_NAME = [表名];这个可以获取到比较完整的信息,满足条件。

我就采用c这种方案了。

 

剩下的就是集合之间的比较问题了,比较简单就不说了。

三、源码地址

https://github.com/telephone6/java-collection.git

 

位于项目的database/mysql-compare模块,修改属性后,运行cn.lxw.mysql.MainApp的main函数即可看到效果。

大家可以关注一下这个仓库,我会不定期传递一些有意思的代码到上面。

四、心得体会

整个思路+实现花费了2个小时的时间,感觉还是值得的吧。毕竟解决了自己的一些问题,心理还是有一点点成就感的,现在看数据库之间的差异就没有那么辛苦了。虽然打印出来是有一点丑,大家可以下载一下自己改良使用。

最后来一句:成就感,让写代码不再那么枯燥。

 

谢谢大家观看!

posted @ 2021-06-04 20:06  罗西施  阅读(2013)  评论(0编辑  收藏  举报