準確獲取表結構信息是開發、運維、遷移、文檔生成的基礎操作。本文系統整理三種核心方法、輸出差異及適用場景。
mysql> DESC authors;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(100) | NO | UNI | NULL | |
| name | varchar(100) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
-- 等價命令
DESCRIBE authors;
SHOW COLUMNS FROM authors;
輸出字段含義:
Field:列名Type:數據類型Null:是否允許 NULL (YES/NO)Key:索引類型 (PRI=主鍵, UNI=唯一, MUL=非唯一索引)Default:默認值Extra:額外屬性 (auto_increment, on update CURRENT_TIMESTAMP 等)mysql> SHOW CREATE TABLE authors\G;
*************************** 1. row ***************************
Table: authors
Create Table: CREATE TABLE `authors` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(100) NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
核心優勢:
\G 垂直顯示適合寬表閱讀mysql> USE information_schema;
Database changed
mysql> SELECT
TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION,
COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_TYPE, COLUMN_KEY, EXTRA,
COLUMN_COMMENT
FROM COLUMNS
WHERE TABLE_SCHEMA='your_db' AND TABLE_NAME='authors';
+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+-------------------+---------------+--------------+------------+----------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | COLUMN_DEFAULT | IS_NULLABLE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | COLUMN_TYPE | COLUMN_KEY | EXTRA | COLUMN_COMMENT |
+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+-------------------+---------------+--------------+------------+----------------+----------------+
| your_db | authors | id | 1 | NULL | NO | int | NULL | 10 | 0 | int(11) | PRI | auto_increment | |
| your_db | authors | email | 2 | NULL | NO | varchar | 100 | NULL | NULL | varchar(100) | UNI | | |
| your_db | authors | name | 3 | NULL | NO | varchar | 100 | NULL | NULL | varchar(100) | | | |
+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+-------------------+---------------+--------------+------------+----------------+----------------+
適用場景:
| 維度 | DESC | SHOW CREATE TABLE | INFORMATION_SCHEMA |
|---|---|---|---|
| 信息完整度 | 列級基礎信息 | 完整 DDL (含引擎、字符集、索引、外鍵、分區) | 列級完整元數據 (含註釋、權限、統計信息) |
| 輸出格式 | 表格 | SQL 文本 | 結果集 (可編程) |
| 性能影響 | 極低 | 低 | 較高 (大量表查詢可能阻塞) |
| 典型用途 | 開發調試、快速確認 | 遷移、備份、版本控制、環境復刻 | 工具開發、治理平台、自動化腳本 |
| 權限要求 | SELECT 權限 | SELECT 權限 | SELECT 權限 + PROCESS (部分視圖) |
-- 生成多表建表語句
SELECT CONCAT('SHOW CREATE TABLE `', TABLE_NAME, '`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='db_name' AND TABLE_TYPE='BASE TABLE';
-- 導出為文件
mysql -uroot -p -e "SELECT CONCAT('SHOW CREATE TABLE \`', TABLE_NAME, '\`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db'" -sN | mysql -uroot -p db > schema.sql
# 獲取兩庫表結構差異
# 1. 導出結構
mysqldump -d db1 > db1_schema.sql
mysqldump -d db2 > db2_schema.sql
# 2. 對比
diff -u db1_schema.sql db2_schema.sql
# 或使用專業工具:schemadiff, pt-table-sync, Flyway/Liquibase
SELECT
TABLE_NAME,
TABLE_ROWS,
ROUND(DATA_LENGTH/1024/1024, 2) AS data_mb,
ROUND(INDEX_LENGTH/1024/1024, 2) AS index_mb,
ROUND((DATA_LENGTH+INDEX_LENGTH)/1024/1024, 2) AS total_mb,
ENGINE,
TABLE_COLLATION,
CREATE_TIME,
UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='db_name'
ORDER BY DATA_LENGTH DESC;
DESC view_name 顯示視圖列定義,但無索引/引擎信息innodb_stats_on_metadata 影響,建議關閉或緩存INFORMATION_SCHEMA.COLUMNS 新增 IS_VISIBLE 字段標識隱藏列掌握這三種方法的差異與組合使用,能讓你在開發調試、架構遷移、工具構建等場景中游刃有餘,高效獲取所需的表結構真相。