提取Oracle和Mysql数据库字典

前言

最近刚好需要整理生产数据库的数据字典,手动一张张表去统计肯定不太现实还容易出错,用SQL来实现效率会高很多。涉及OracleMysql两种数据库的数据提取,两个数据库的解决思路不同,Oracle是用视图的方式来解决,Mysql则是使用了INFORMATION_SCHEMA这个特殊的数据库来辅助我们提取数据。本篇文章将对2种方式进行介绍,希望对各位读者有所帮助。

一、Oracle数据库

ALL_TAB_COLUMNSALL_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_SCHEMAMySQL 数据库中的一个特殊的数据库,它包含了关于其他数据库的元数据(即数据的数据)。换句话说,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'
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容