基於 information_schema 系統庫,可通過標準 SQL 查詢獲取 MySQL 實例中所有對象的結構定義,支援自動化文檔生成、代碼生成、異構遷移驗證、Schema 比對等場景。本文匯總生產環境驗證的核心查詢模板,基於示例庫 sakila (MySQL 官方樣本庫) 實測有效。
USE sakila; -- 切換到目標數據庫
SHOW TABLES;
-- 或標準 SQL
SELECT TABLE_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
-- 方法 1: DESC (簡潔)
DESC actor;
-- 方法 2: 標準 SQL (詳盡)
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE,
CASE IS_NULLABLE WHEN 'NO' THEN 0 ELSE 1 END AS IS_NULLABLE,
COLUMN_TYPE,
COLUMN_COMMENT,
COLUMN_KEY, -- PRI/UNI/MUL
EXTRA -- auto_increment 等
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_NAME = 'actor'
ORDER BY ORDINAL_POSITION;
SELECT TABLE_NAME, CREATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_TYPE = 'VIEW'
ORDER BY TABLE_NAME;
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, NUMERIC_SCALE,
CASE IS_NULLABLE WHEN 'NO' THEN 0 ELSE 1 END AS IS_NULLABLE,
COLUMN_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_NAME = 'actor_info'
ORDER BY ORDINAL_POSITION;
SELECT VIEW_DEFINITION
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_NAME = 'actor_info';
SELECT
INDEX_NAME,
COUNT(*) AS COLUMN_COUNT,
MAX(NON_UNIQUE) AS NON_UNIQUE,
CASE INDEX_NAME WHEN 'PRIMARY' THEN 1 ELSE 0 END AS IS_PRIMARY
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_NAME = 'customer'
GROUP BY INDEX_NAME
ORDER BY INDEX_NAME;
SELECT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'sakila' AND TABLE_NAME = 'customer'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
SELECT
kcu.CONSTRAINT_NAME,
kcu.COLUMN_NAME,
kcu.ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE kcu.TABLE_SCHEMA = 'sakila'
AND kcu.TABLE_NAME = 'address'
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY kcu.ORDINAL_POSITION;
SELECT DISTINCT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = 'sakila'
AND TABLE_NAME = 'customer'
AND CONSTRAINT_TYPE = 'FOREIGN KEY';
SELECT
kcu.CONSTRAINT_NAME,
kcu.COLUMN_NAME,
kcu.POSITION_IN_UNIQUE_CONSTRAINT,
kcu.REFERENCED_TABLE_NAME,
kcu.REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE kcu.TABLE_SCHEMA = 'sakila'
AND kcu.TABLE_NAME = 'customer'
AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY kcu.CONSTRAINT_NAME, kcu.POSITION_IN_UNIQUE_CONSTRAINT;
SELECT DISTINCT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'sakila'
AND REFERENCED_TABLE_NAME = 'customer';
SELECT
kcu.CONSTRAINT_NAME,
kcu.TABLE_NAME,
kcu.COLUMN_NAME,
kcu.POSITION_IN_UNIQUE_CONSTRAINT,
kcu.REFERENCED_TABLE_NAME,
kcu.REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE kcu.TABLE_SCHEMA = 'sakila'
AND kcu.REFERENCED_TABLE_NAME = 'customer'
AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY kcu.CONSTRAINT_NAME, kcu.POSITION_IN_UNIQUE_CONSTRAINT;
SELECT ROUTINE_NAME, CREATED
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'sakila' AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY ROUTINE_NAME;
SELECT ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'sakila' AND ROUTINE_NAME = 'film_in_stock';
SELECT PARAMETER_NAME, PARAMETER_MODE, DATA_TYPE, DTD_IDENTIFIER
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE SPECIFIC_SCHEMA = 'sakila' AND SPECIFIC_NAME = 'film_in_stock'
ORDER BY ORDINAL_POSITION;
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING, ACTION_STATEMENT
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA = 'sakila'
ORDER BY EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION;
SELECT TABLE_NAME AS OBJECT_NAME, 'TABLE' AS OBJECT_TYPE, CREATE_TIME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='sakila' AND TABLE_TYPE='BASE TABLE'
UNION ALL
SELECT TABLE_NAME, 'VIEW', CREATE_TIME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='sakila' AND TABLE_TYPE='VIEW'
UNION ALL
SELECT ROUTINE_NAME, ROUTINE_TYPE, CREATED
FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='sakila'
UNION ALL
SELECT TRIGGER_NAME, 'TRIGGER', CREATED
FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA='sakila'
ORDER BY OBJECT_TYPE, OBJECT_NAME;
information_schema 導出結果 → 差異報警。information_schema 是 MySQL 元數據的「唯一真相來源」。掌握 TABLES、COLUMNS、STATISTICS、KEY_COLUMN_USAGE、TABLE_CONSTRAINTS、VIEWS、ROUTINES、TRIGGERS、PARAMETERS 九大核心表的聯查模式,即可構建任意自動化 Schema 管理工具鏈。本文模板經 sakila 庫實測,可直接適配生產環境任意庫。