information_schema
是 MySQL 中的一个系统数据库,它提供了关于数据库元数据的信息。元数据是指描述数据库结构和内容的数据,例如表、列、索引、用户权限等。information_schema
数据库是只读的,用户不能对其进行修改。
位置
information_schema
数据库存在于每个 MySQL 实例中,不需要单独创建。当你连接到 MySQL 服务器时,可以通过以下方式访问 information_schema
数据库:
USE information_schema;
或者在查询中直接指定 information_schema
数据库:
SELECT * FROM information_schema.tables;
主要表
information_schema
数据库包含多个表,每个表都提供了不同类型的信息。以下是一些常用的表及其描述:
-
TABLES
- 描述:包含所有表的信息。
- 常用字段:
TABLE_CATALOG
:表所属的目录(通常是def
)。TABLE_SCHEMA
:表所属的数据库名称。TABLE_NAME
:表的名称。TABLE_TYPE
:表的类型(如BASE TABLE
或VIEW
)。ENGINE
:表的存储引擎(如InnoDB
、MyISAM
等)。TABLE_ROWS
:表中的行数(近似值)。AUTO_INCREMENT
:自动递增字段的下一个值。
-
COLUMNS
- 描述:包含所有列的信息。
- 常用字段:
TABLE_CATALOG
:列所属的目录(通常是def
)。TABLE_SCHEMA
:列所属的数据库名称。TABLE_NAME
:列所属的表名称。COLUMN_NAME
:列的名称。ORDINAL_POSITION
:列在表中的位置。COLUMN_DEFAULT
:列的默认值。IS_NULLABLE
:列是否允许为空。DATA_TYPE
:列的数据类型。CHARACTER_MAXIMUM_LENGTH
:字符列的最大长度。NUMERIC_PRECISION
:数值列的精度。NUMERIC_SCALE
:数值列的小数位数。
-
SCHEMATA
- 描述:包含所有数据库的信息。
- 常用字段:
CATALOG_NAME
:数据库所属的目录(通常是def
)。SCHEMA_NAME
:数据库的名称。DEFAULT_CHARACTER_SET_NAME
:数据库的默认字符集。DEFAULT_COLLATION_NAME
:数据库的默认排序规则。
-
STATISTICS
- 描述:包含所有索引的信息。
- 常用字段:
TABLE_CATALOG
:索引所属的目录(通常是def
)。TABLE_SCHEMA
:索引所属的数据库名称。TABLE_NAME
:索引所属的表名称。INDEX_NAME
:索引的名称。NON_UNIQUE
:索引是否允许重复值。SEQ_IN_INDEX
:索引字段在索引中的位置。COLUMN_NAME
:索引字段的名称。CARDINALITY
:索引的基数(近似值)。SUB_PART
:索引字段的前缀长度(如果有的话)。
-
ROUTINES
- 描述:包含所有存储过程和函数的信息。
- 常用字段:
SPECIFIC_NAME
:存储过程或函数的名称。ROUTINE_CATALOG
:存储过程或函数所属的目录(通常是def
)。ROUTINE_SCHEMA
:存储过程或函数所属的数据库名称。ROUTINE_NAME
:存储过程或函数的名称。ROUTINE_TYPE
:存储过程或函数的类型(如PROCEDURE
或FUNCTION
)。DATA_TYPE
:返回值的数据类型(仅适用于函数)。IS_DETERMINISTIC
:存储过程或函数是否是确定性的。SQL_DATA_ACCESS
:存储过程或函数对数据的访问级别。
-
VIEWS
- 描述:包含所有视图的信息。
- 常用字段:
TABLE_CATALOG
:视图所属的目录(通常是def
)。TABLE_SCHEMA
:视图所属的数据库名称。TABLE_NAME
:视图的名称。VIEW_DEFINITION
:视图的定义SQL语句。CHECK_OPTION
:视图的检查选项(如NONE
、LOCAL
、CASCADED
)。IS_UPDATABLE
:视图是否可更新。
-
USER_PRIVILEGES
- 描述:包含所有用户的全局权限信息。
- 常用字段:
GRANTEE
:用户的名称和主机。TABLE_CATALOG
:权限所属的目录(通常是def
)。PRIVILEGE_TYPE
:权限类型(如SELECT
、INSERT
、UPDATE
等)。IS_GRANTABLE
:是否可以授予他人。
-
SCHEMA_PRIVILEGES
- 描述:包含所有数据库的权限信息。
- 常用字段:
GRANTEE
:用户的名称和主机。TABLE_CATALOG
:权限所属的目录(通常是def
)。TABLE_SCHEMA
:数据库的名称。PRIVILEGE_TYPE
:权限类型(如SELECT
、INSERT
、UPDATE
等)。IS_GRANTABLE
:是否可以授予他人。
-
TABLE_PRIVILEGES
- 描述:包含所有表的权限信息。
- 常用字段:
GRANTEE
:用户的名称和主机。TABLE_CATALOG
:权限所属的目录(通常是def
)。TABLE_SCHEMA
:数据库的名称。TABLE_NAME
:表的名称。PRIVILEGE_TYPE
:权限类型(如SELECT
、INSERT
、UPDATE
等)。IS_GRANTABLE
:是否可以授予他人。
-
COLUMN_PRIVILEGES
- 描述:包含所有列的权限信息。
- 常用字段:
GRANTEE
:用户的名称和主机。TABLE_CATALOG
:权限所属的目录(通常是def
)。TABLE_SCHEMA
:数据库的名称。TABLE_NAME
:表的名称。COLUMN_NAME
:列的名称。PRIVILEGE_TYPE
:权限类型(如SELECT
、INSERT
、UPDATE
等)。IS_GRANTABLE
:是否可以授予他人。
示例查询
以下是一些常见的查询示例,展示了如何使用 information_schema
数据库获取元数据信息:
-
查询所有数据库:
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA;
-
查询特定数据库中的所有表:
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
-
查询特定表的所有列:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
-
查询特定表的所有索引:
SELECT INDEX_NAME, NON_UNIQUE, COLUMN_NAME, SEQ_IN_INDEX FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
-
查询特定用户的全局权限:
SELECT PRIVILEGE_TYPE, IS_GRANTABLE FROM information_schema.USER_PRIVILEGES WHERE GRANTEE = '''username''@''host''';
通过 information_schema
数据库,你可以轻松地获取和管理数据库的元数据信息,这对于数据库管理和优化非常有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步