SHOW CREATE VIEW 返回视图的完整创建语句,包括 CREATE VIEW、视图名、AS SELECT 子句、ALGORITHM、DEFINER、SQL SECURITY 等元信息,是可直接复用或迁移的 DDL 语句。

show create view 返回什么内容
SHOW CREATE VIEW 直接输出视图的完整创建语句,包括 CREATE VIEW 关键字、视图名、字段别名(如有)、AS SELECT ... 子句,以及 MySQL 自动添加的 ALGORITHM、DEFINER 和 SQL SECURITY 等元信息。
它不是结构摘要,也不是执行计划,而是可直接复用或迁移的 DDL 语句。如果你要导出视图逻辑、做版本比对、或排查字段来源,这个命令是唯一能拿到原始定义的方式。
- 输出中字段名若来自表达式(如
quantity * price),MySQL 会自动为其生成别名(如quantity * price);若原SELECT中用了AS,则保留该别名 - 如果视图依赖的基表不存在,
SHOW CREATE VIEW仍能成功执行并返回定义,但后续查询会报错 - 输出默认为单行文本,加
\G可格式化(仅在 MySQL 命令行客户端有效,不适用于程序接口)
为什么不能用 show create table 查视图
SHOW CREATE TABLE 专用于物理表,对视图会报错:ERROR 1356 (HY000): View 'db.v_name' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them —— 即使视图本身合法,也会触发此错误。
根本原因是 MySQL 内部将视图和表的元数据存储在不同系统表中:TABLES 表里 TABLE_TYPE 字段为 VIEW 的条目,不会被 SHOW CREATE TABLE 解析。
- 误用
SHOW CREATE TABLE v_name是新手高频错误,现象是“明明视图存在却提示找不到表” - 部分 ORM 或数据库工具(如早期 phpMyAdmin)在未明确区分对象类型时,可能底层错发该命令,导致界面报错
-
DESCRIBE v_name和SHOW CREATE VIEW v_name必须配合使用:前者看字段结构,后者看逻辑来源
权限不足时 show create view 会怎样
执行 SHOW CREATE VIEW 需要当前用户拥有 SHOW VIEW 权限。没有该权限时,MySQL 返回:ERROR 1142 (42000): SHOW VIEW command denied to user 'u'@'h' for table 'v_name'。
注意这不是语法错误,而是权限拒绝。即使你能 SELECT 视图数据,也不代表有权限看其定义——这是 MySQL 实现数据访问控制(DAC)的关键隔离点。
- 检查权限可用:
SHOW GRANTS FOR CURRENT_USER;,确认输出中包含GRANT SHOW VIEW ON `db`.* TO ... - DBA 授予权限的典型写法:
GRANT SHOW VIEW ON `mydb`.* TO 'dev'@'%'; - 云数据库(如阿里云 RDS、腾讯云 CVM)常默认关闭该权限,需手动申请或通过控制台开启
从 information_schema 查询视图定义是否可行
可以,但不推荐。虽然 SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = 'v_name'; 能取到定义字符串,但它有严重缺陷:
- 返回的是纯文本字段,不带
CREATE VIEW头部、DEFINER、ALGORITHM等关键上下文,无法直接执行 -
VIEW_DEFINITION字段被 MySQL 自动 URL 编码过(如空格变%20),需额外解码才能阅读 - 某些旧版本 MySQL(如 5.6)在视图含子查询时,该字段可能为空或截断
- 需要
SELECT权限访问information_schema.VIEWS,而该权限常被严格限制
真正需要脚本批量提取时,应优先用 SHOW CREATE VIEW + 客户端解析,而不是硬啃 information_schema。


















