在 Oracle 資料庫管理中,複製資料表是常見的操作需求。無論是為了備份、測試或是建立新環境,掌握 CREATE TABLE AS SELECT (CTAS) 的各種用法都能大幅提升工作效率。本文將系統整理四種核心複製場景,並說明索引遺失的補救方式。
利用永遠為假的條件 WHERE 1 <> 1,讓查詢不回傳任何列,僅保留欄位定義:
CREATE TABLE b AS SELECT * FROM a WHERE 1 <> 1;
新表 b 將擁有與 a 相同的欄位名稱、資料型態與 NOT NULL 約束,但不包含主鍵、唯一鍵、外鍵、索引等物件。
最簡單的完整複製語法:
CREATE TABLE b AS SELECT * FROM a;
執行後,b 將包含 a 所有資料列,適用於快速建立測試資料集。
在 SELECT 列表中明確列出所需欄位,搭配 WHERE 1 <> 1:
CREATE TABLE b AS SELECT row_id, name, age FROM a WHERE 1 <> 1;
前提是 row_id、name、age 皆為 a 表現有欄位。
移除 WHERE 條件即可帶入實際資料:
CREATE TABLE b AS SELECT row_id, name, age FROM a;
若目標表已存在,改用 INSERT INTO ... SELECT:
INSERT INTO t2 (column1, column2, ...)
SELECT column1, column2, ... FROM t1;
欄位順序與型態必須一一對應,否則會報錯。
CTAS 僅複製「欄位定義」與「資料」,不會帶過主鍵、唯一索引、外鍵、普通索引、Check 約束等。建立新表後,請手動補齊:
SELECT * FROM user_indexes WHERE table_name = 'A';CREATE INDEX ...、ALTER TABLE ... ADD CONSTRAINT ...| 需求 | SQL 範例 | 結果 |
|---|---|---|
| 只複製結構 | CREATE TABLE b AS SELECT * FROM a WHERE 1<>1; | 空表,同欄位定義 |
| 結構+全部資料 | CREATE TABLE b AS SELECT * FROM a; | 完整副本 |
| 指定欄位結構 | CREATE TABLE b AS SELECT col1,col2 FROM a WHERE 1<>1; | 空表,僅含指定欄位 |
| 指定欄位+資料 | CREATE TABLE b AS SELECT col1,col2 FROM a; | 含資料的子集表 |
| 寫入既有表 | INSERT INTO t2 SELECT ... FROM t1; | 追加資料 |
掌握這五種模式,即可應付絕大多數 Oracle 資料表複製場景。實務上建議搭配 DBMS_METADATA.GET_DDL 取得完整 DDL,一次完成結構、索引、約束的遷移。