前言
最近刚好需要整理生产数据库的数据字典,手动一张张表去统计肯定不太现实还容易出错,用SQL来实现效率会高很多。涉及
Oracle
和Mysql
两种数据库的数据提取,两个数据库的解决思路不同,Oracle
是用视图的方式来解决,Mysql
则是使用了INFORMATION_SCHEMA
这个特殊的数据库来辅助我们提取数据。本篇文章将对2种方式进行介绍,希望对各位读者有所帮助。
一、Oracle数据库
ALL_TAB_COLUMNS
和ALL_COL_COMMENTS
这两个视图可以帮助我们查询指定用户下的表字段信息,前者可以查询包含表名、表字段名、表字段类型、表字段长度等信息,后者则是可以查询表字段的备注。(是的,由于字段的备注单独在ALL_COL_COMMENTS
视图里面,所以要联表才能查询到想要的所有信息)
SELECT
TAB.TABLE_NAME ,
TAB.COLUMN_NAME ,
TAB.DATA_TYPE ,
TAB.DATA_LENGTH ,
TAB.DATA_PRECISION ,
TAB.DATA_SCALE,
COL.COMMENTS
FROM
ALL_TAB_COLUMNS TAB
INNER JOIN
ALL_COL_COMMENTS COL
ON
TAB.TABLE_NAME = COL.TABLE_NAME AND
TAB.COLUMN_NAME = COL.COLUMN_NAME
WHERE
COL.OWNER = 'USER_NAME' AND TAB.OWNER = 'USER_NAME'
ORDER BY
TABLE_NAME, COLUMN_ID;
需要注意的是,这两个视图一般只有超管才有权限查询,如果是普通用户的话,我们可以用用户级的视图来处理
没有管理员权限就改成用下面的SQL
SELECT
TAB.TABLE_NAME AS "表名" ,
TAB.COLUMN_NAME AS "字段名" ,
TAB.DATA_TYPE AS "字段类型",
TAB.DATA_LENGTH AS "字段长度",
-- TAB.DATA_PRECISION AS "表名",
-- TAB.DATA_SCALE AS "表名",
COL.COMMENTS AS "字段含义"
FROM
USER_TAB_COLUMNS TAB
JOIN
USER_COL_COMMENTS COL
ON
TAB.TABLE_NAME = COL.TABLE_NAME AND
TAB.COLUMN_NAME = COL.COLUMN_NAME
ORDER BY
TAB.TABLE_NAME, TAB.COLUMN_ID ;
二、Mysql数据库
INFORMATION_SCHEMA
是 MySQL
数据库中的一个特殊的数据库,它包含了关于其他数据库的元数据(即数据的数据)。换句话说,INFORMATION_SCHEMA
提供了关于 MySQL
服务器上所有其他数据库的结构和存储的信息。这个特殊的数据库不需要用户创建,它是自动存在的,并且不能被删除。它主要用于查询关于数据库、表、列、索引和其他数据库对象的信息。
INFORMATION_SCHEMA
中包含了许多表,每个表都存储了不同类型的元数据。以下是一些最常用的 INFORMATION_SCHEMA
表:
- SCHEMATA:包含数据库的元数据,如数据库名、字符集和默认的碰撞字符集。
- TABLES:包含关于每个数据库中表的信息,如表名、表类型(基表、视图等)、所属数据库和表的引擎类型。
- COLUMNS:包含数据库表的列的信息,如列名、数据类型、是否允许为 NULL、默认值等。
- INDEXES:包含关于表的索引的信息,如索引名称、索引类型、索引所在的表等。
- STATISTICS:包含关于表的统计信息,如表的行数、数据长度、索引长度等。
- ROUTINES:包含存储过程和函数的信息。
- VIEWS:包含关于数据库视图的信息。
- TRIGGERS:包含关于数据库触发器的信息。
- ENGINES:包含关于不同存储引擎的信息。
- PLUGINS:包含已安装的插件的信息。
- PROCESSLIST:包含当前运行的所有线程的信息,类似于 SHOW PROCESSLIST 命令的结果。
- USER_PRIVILEGES:包含全局权限的信息。
SELECT
T.TABLE_NAME,
T.TABLE_COMMENT ,
C.COLUMN_NAME ,
C.COLUMN_TYPE ,
C.COLUMN_COMMENT
FROM
INFORMATION_SCHEMA.TABLES AS T ,
INFORMATION_SCHEMA.columns AS C
WHERE
C.TABLE_NAME = T.TABLE_NAME
AND T.TABLE_SCHEMA = 'DB_NAME'