開發、遷移、逆向工程、自動化代碼生成,都離不開精準的表結構元數據。本文系統梳理 MySQL 獲取「庫、表、列、索引、備註」的所有標準方式,並給出生產級查詢模板。
| 命令 | 等價命令 | 輸出重點 | 適用場景 |
|---|---|---|---|
DESC tbl_name; | DESCRIBE tbl_name; | Field, Type, Null, Key, Default, Extra | 快速查看列定義 |
SHOW COLUMNS FROM tbl_name; | SHOW FIELDS FROM tbl_name; | 同上,可加 LIKE 'pattern' | 過濾特定列 |
SHOW CREATE TABLE tbl_name; | — | 完整建表 DDL (含引擎、字符集、分區、外鍵) | 遷移、備份、審計 |
SHOW TABLE STATUS [LIKE 'pattern']; | — | 行數、大小、引擎、自增值、創建時間、校驗和 | 容量評估、碎片分析 |
SHOW INDEX FROM tbl_name; | SHOW KEYS FROM tbl_name; | 索引名、唯一性、列序、基數、類型 (BTREE/HASH) | 索引優化、重複索引檢測 |
所有上述 SHOW 命令本質都是查詢 INFORMATION_SCHEMA 系統視圖。直接查視圖可實現:
| 視圖 | 核心列 | 典型用途 |
|---|---|---|
SCHEMATA | CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME | 列舉所有庫 |
TABLES | TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH | 庫/表清單、大小統計 |
COLUMNS | TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMN_TYPE, COLUMN_KEY, EXTRA, COLUMN_COMMENT | 完整列定義、備註、自增、主鍵標識 |
STATISTICS | INDEX_NAME, SEQ_IN_INDEX, COLUMN_NAME, NON_UNIQUE, INDEX_TYPE, CARDINALITY | 索引結構分析 |
TABLE_CONSTRAINTS | CONSTRAINT_NAME, CONSTRAINT_TYPE (PRIMARY KEY, FOREIGN KEY, UNIQUE) | 約束關係梳理 |
KEY_COLUMN_USAGE | REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME | 外鍵引用鏈路 |
SELECT
COLUMN_NAME,
DATA_TYPE,
COLUMN_TYPE,
IS_NULLABLE,
COLUMN_DEFAULT,
COLUMN_KEY,
EXTRA,
COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table'
ORDER BY ORDINAL_POSITION;
SELECT TABLE_NAME, TABLE_ROWS,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_ROWS DESC;
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES t
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS c
ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
AND t.TABLE_NAME = c.TABLE_NAME
AND c.CONSTRAINT_TYPE = 'PRIMARY KEY'
WHERE t.TABLE_SCHEMA = 'your_db'
AND t.TABLE_TYPE = 'BASE TABLE'
AND c.CONSTRAINT_NAME IS NULL;
SELECT CONCAT('SHOW CREATE TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN ('db1','db2') AND TABLE_TYPE = 'BASE TABLE';
ALTER TABLE tb_webparamcounter DROP INDEX AK_PAS_Name;
ALTER TABLE tb_webparamcounter ADD UNIQUE AK_PAS_Name (PC_ID, PAC_Name);
-- 必須先刪外鍵再改索引
ALTER TABLE tb_webparamcounter DROP FOREIGN KEY fk_name;
ALTER TABLE tb_webparamcounter DROP INDEX AK_PAS_Name;
ALTER TABLE tb_webparamcounter ADD UNIQUE AK_PAS_Name (PC_ID, PAC_Name, PAC_Value);
INFORMATION_SCHEMA 需 SELECT 權限,無需 SHOW VIEW 或 PROCESS。TABLES.TABLE_ROWS 為估算值,精確行數需 COUNT(*)。STATISTICS.CARDINALITY 為索引基數估算,驅動優化器決策,定期 ANALYZE TABLE 更新。交互式用 DESC/SHOW 快;自動化/跨庫/複雜分析直查 INFORMATION_SCHEMA。掌握核心視圖結構與高頻查詢模板,讓元數據服務於代碼生成、架構治理、遷移校驗等高價值場景。