在 Oracle 中查看表結構不只有 DESC 一種方式。本文彙整 SQL*Plus/開發工具、PL/SQL 程式化、資料字典視圖、匯出 DDL 四大維度的查看方法,適用於互動式查詢、自動化腳本、文件生成、跨環境比對等場景。
-- 最常用
DESC table_name;
-- 或
DESCRIBE table_name;
-- 只看欄位名與型別
DESC table_name;
-- 輸出範例
Name Null? Type
------------- -------- -------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SELECT column_name, data_type, data_length, data_precision, data_scale,
nullable, data_default, column_id
FROM user_tab_columns
WHERE table_name = UPPER('emp')
ORDER BY column_id;
SELECT column_name, comments
FROM user_col_comments
WHERE table_name = UPPER('emp');
-- 主鍵、外鍵、唯一、檢查約束
SELECT c.constraint_name, c.constraint_type, c.search_condition, c.status,
cc.column_name, cc.position
FROM user_constraints c
JOIN user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE c.table_name = UPPER('emp')
ORDER BY c.constraint_type, cc.position;
SELECT i.index_name, i.index_type, i.uniqueness, i.status, i.compression,
ic.column_name, ic.column_position, ic.descend
FROM user_indexes i
JOIN user_ind_columns ic ON i.index_name = ic.index_name
WHERE i.table_name = UPPER('emp')
ORDER BY i.index_name, ic.column_position;
SELECT partition_name, tablespace_name, num_rows, blocks, compression
FROM user_tab_partitions
WHERE table_name = UPPER('emp');
-- 導出單表 DDL(含索引、約束、授權、分區、壓縮等)
SET LONG 1000000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP', 'SCOTT') FROM DUAL;
-- 導出特定 Schema 所有表 DDL
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name, owner)
FROM dba_tables
WHERE owner = 'SCOTT';
-- 導出依賴物件(索引、觸發器、授權)
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('INDEX', 'EMP', 'SCOTT') FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('TRIGGER', 'EMP', 'SCOTT') FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('GRANT', 'EMP', 'SCOTT') FROM DUAL;
參數美化:
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY', TRUE);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE); -- 隱藏 TABLESPACE 等
# 只導出結構,不導資料
expdp scott/tiger directory=dp_dir dumpfile=meta.dmp content=METADATA_ONLY tables=EMP
# 只導出特定物件類型
expdp ... content=METADATA_ONLY include=TABLE:"IN ('EMP','DEPT')"
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 快速互動確認欄位型別 | DESC | 零配置、即時回饋 |
| 自動化腳本抓取結構 | USER_TAB_COLUMNS | 標準 SQL、跨工具相容 |
| 生成建表腳本遷移/版控 | DBMS_METADATA.GET_DDL | 完整、可重現、含儲存屬性 |
| 跨環境結構比對 | DBMS_METADATA + DIFF 工具 | 消除格式差異,專注語義差異 |
| 文件生成(Data Dictionary) | USER_TAB_COLUMNS + USER_COL_COMMENTS | 可 JOIN 產出豐富報表 |
-- MySQL
DESC table_name;
SHOW CREATE TABLE table_name;
SELECT * FROM information_schema.columns WHERE table_name = 'emp';
-- PostgreSQL
\d table_name
\d+ table_name
SELECT * FROM information_schema.columns WHERE table_name = 'emp';
掌握多維度查看表結構技巧,能在開發除錯、架構審查、自動化部署、異構遷移等場景中游刃有餘,將「看結構」從手工動作轉為可程式化、可版控的工程化能力。