Mysql查询表的结构信息 把列名 数据类型 等变成列数据(适用于生成数据库表结构文档) (一)

发布于:2024-04-20 ⋅ 阅读:(41) ⋅ 点赞:(0)

现在这行情,情况差的不行了,开发满地走,java多如狗。但是高级开发或者更深层次的开发还是不多的。

所以要提升自己的设计和文档能力!

比如,当你开发一定年限后,肯定会接触到一些文档的输出,当然包含但不限于技术文档,设计文档,时序图,架构图等等,其中当你出设计文档的时候,往往会有一个文档让你很烦,就是数据库设计文档。

比如这种

当产品或者项目用到表很多的时候,出文档是不是很烦,一个字段一个字段的对比,当然某些orm框架是可以查看的且生成的,比如idea的插件根据JPA注解(如@Entity@Table@Column等)并展示数据库表结构,再比如根据Hibernate Tools等JPA工具,再比如根据反射自定义生成,但是要写很多配置就很烦

本文没那么复杂,仅仅一条sql就可以实现!!!

话不多说,立马行动!

查询表的结构信息 把列名 数据类型  长度等变成列数据

SELECT COLUMN_NAME AS 列名,
DATA_TYPE AS 数据类型  
FROM 
INFORMATION_SCHEMA.COLUMNS  
WHERE TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
AND TABLE_NAME = 'users'; -- 替换为你的表名

再加上 数据类型的长度 和说明(COMMENT)还有是否允许为空

SELECT   
    COLUMN_NAME AS 列名,  
    DATA_TYPE AS 数据类型,  
    CHARACTER_MAXIMUM_LENGTH AS 数据类型长度,  
    COLUMN_COMMENT AS 说明,  
    IS_NULLABLE AS 是否允许为空  
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
    AND TABLE_NAME = 'users'; -- 替换为你的表名

到这有朋友可能会问我数据表结构 类型和长度啥的放一起的(比如 id int(11)) 你这怎么分开了?

这里确实分开了,是不是想拼接? 真聪明   答错了!

莫冲动!莫慌,当然不需要拼接

如果把数据类型 和数据类型长度一起显示呢 比如varchar(200)

SELECT   
    COLUMN_NAME AS 列名,  
    COLUMN_TYPE AS 数据类型_包括长度,  
    COLUMN_COMMENT AS 说明,  
    IS_NULLABLE AS 是否允许为空  
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = '你的数据库名' -- 替换为你的数据库名  
    AND TABLE_NAME = 'zb'; -- 替换为你的表名

COLUMN_TYPE会返回类似varchar(255)int(11)这样的完整数据类型定义

请注意,COLUMN_TYPE返回的是完整的数据类型定义,所以即使某些数据类型(如整数类型)没有显式指定长度,它也可能包含一些默认的长度或显示信息(如int(11)中的11,这通常只是显示宽度,并不限制值的范围)。

到这就差不多了,还差一个序号和是否为空的汉字(是和否)

先来是和否,很简单啊,小可爱

这样就行了

SELECT   
    COLUMN_NAME AS 列名,   
		 COLUMN_TYPE as 数据类型,
    COLUMN_COMMENT AS 说明,  
    CASE IS_NULLABLE 
    WHEN 'NO' THEN'否'
	  ELSE '是'
    end as 是否允许为空
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
    AND TABLE_NAME = 'users'; -- 替换为你的表名

如果有别的 那就

SELECT   
    COLUMN_NAME AS 列名,   
		 COLUMN_TYPE as 数据类型,
    COLUMN_COMMENT AS 说明,  
    CASE IS_NULLABLE 
    WHEN 'NO' THEN'否'
		WHEN 'YES' THEN'是'
		-- 一直when then
	  ELSE '是'
    end as 是否允许为空
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
    AND TABLE_NAME = 'users'; -- 替换为你的表名

OK!还差一个序号。

添加一个自增的序号,可以使用MySQL的变量来实现

SET @row_number = 0;
SELECT   
    (@row_number:=@row_number + 1) AS 序号,  
     COLUMN_NAME AS 列名,   
		 COLUMN_TYPE as 数据类型,
    COLUMN_COMMENT AS 说明,  
CASE IS_NULLABLE WHEN 'NO' THEN'否'
	ELSE '是'
end
as 是否允许为空
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
    AND TABLE_NAME = 'users'; -- 替换为你的表名  
ORDER BY   
    ORDINAL_POSITION; -- 按照列在表中的位置排序

一定是两个语句一起执行哦

以上就是查询结果

其实原理很简单,就是mysql提供了查询所有的库和所有数据库表还有还有所有数据库表字段的查询语句

SELECT   
    *
FROM   
    INFORMATION_SCHEMA.COLUMNS  
WHERE   
    TABLE_SCHEMA = 'dangyuanjiaoyuguanli' -- 替换为你的数据库名  
		

所有的表及对应的列都能查到哦

查询所有表

查询所有数据库

以及其他

自己研究去

数据查到了对吧那么怎么生成文档呢? 很简单,我们的一些工具可以!

比如 navicat  sqlyog都可以

详情见下期

Mysql查询表的结构信息 把列名 数据类型 等变成列数据(适用于生成数据库表结构文档) (二)

 以上是mysql的,至于其他数据库请参照对应的文档