DESCRIBE 仅在 MySQL 和 MariaDB 中原生支持,PostgreSQL、SQL Server、SQLite 均不识别;其输出中 Key、Null、Extra 列对索引、非空约束和自增/自动更新等关键特性至关重要;注释需用 SHOW FULL COLUMNS 或查 information_schema 才能显示。

DESCRIBE 命令在哪些数据库里能用
不是所有 SQL 数据库都支持 DESCRIBE —— 它是 MySQL 和 MariaDB 的原生命令,PostgreSQL、SQL Server、SQLite 都不认这个写法。如果你连的是 PostgreSQL,输 DESCRIBE users; 会直接报错 ERROR: syntax error at or near "DESCRIBE";SQL Server 则可能提示“‘DESCRIBE’ 不是可识别的内置函数名称”。
实操建议:
- 先确认当前数据库类型:
SELECT VERSION();(MySQL)、SELECT version();(PostgreSQL)或看连接字符串里的 driver - MySQL/MariaDB 可放心用
DESCRIBE table_name;或简写DESC table_name; - PostgreSQL 改用
\d table_name(psql 命令行)或SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'users'; - SQL Server 用
sp_help 'table_name';或查询sys.columns
DESCRIBE 输出字段里哪些最值得盯
DESCRIBE 返回的五列中,Field、Type、Null、Key、Default、Extra 都有实际意义,但新手常忽略后三者。
实操建议:
-
Key列显示PRI表主键,MUL表普通索引(非唯一),UNI表唯一索引 —— 如果查用户表发现email字段 Key 是空,但业务要求唯一,这就是隐患 -
Null为NO才代表NOT NULL约束生效;若显示YES却没设默认值,INSERT 时漏填该字段就会报错Column 'xxx' cannot be null -
Extra出现auto_increment说明是自增主键;出现on update CURRENT_TIMESTAMP意味着该字段会在 UPDATE 时自动刷新,别误以为只读
DESCRIBE 查不到注释?那是你没配对的元数据
DESCRIBE 默认不显示字段注释(COMMENT),哪怕建表时写了 COMMENT '用户昵称',输出里也看不到。这不是命令问题,是 MySQL 的信息显示策略:注释存在 information_schema.COLUMNS.COLUMN_COMMENT,但 DESCRIBE 不拉这一列。
实操建议:
- 要带注释查结构,改用:
SHOW FULL COLUMNS FROM users;—— 注意是FULL,不是SHOW COLUMNS - 或者直接查系统表:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME = 'users' AND TABLE_SCHEMA = 'your_db_name'; - 如果用 ORM(如 Django、Laravel),生成 migration 时注释可能丢失,得手动补
COMMENT,否则SHOW FULL COLUMNS也为空
为什么 DESCRIBE 有时卡住或返回空?常见阻塞点
DESCRIBE 本身极快,但卡住大概率不是它的问题,而是底层元数据锁或权限问题。比如在大表上刚执行过 ALTER TABLE,还没彻底完成,这时 DESCRIBE 可能被阻塞;或者用户只有 SELECT 权限,没有 SHOW VIEW 或 SELECT 系统表权限,就查不到结构。
实操建议:
- 检查是否真卡住:执行
SHOW PROCESSLIST;,看状态是不是Waiting for table metadata lock - 确认权限:
SHOW GRANTS FOR CURRENT_USER;,确保有SELECT权限且数据库名拼写正确(大小写敏感取决于 OS) - 表名含特殊字符(如中划线、空格)必须用反引号:
DESCRIBE `my-table`;,否则报错Unknown table - 临时表、视图不能用
DESCRIBE查结构,视图要用SHOW CREATE VIEW view_name;
真正麻烦的是跨数据库兼容性——写一个脚本自动导出表结构时,不能只靠 DESCRIBE。字段注释、约束类型、索引详情这些,各数据库存的位置和命名规则差得挺远,硬统一容易漏关键信息。

















