-- 僅複製結構(列名、類型、空值性)與數據
SELECT * INTO NewTable FROM OldTable WHERE 1=0;
-- 不複製:主鍵、外鍵、索引、檢查約束、預設值、觸發器、權限
-- Oracle 同樣不複製約束!需手動添加
CREATE TABLE NewTable AS SELECT * FROM OldTable;
-- 假設 PK 列:col VARCHAR(10)
ALTER TABLE T ALTER COLUMN col VARCHAR(5); -- ❌ 報錯
-- 非 PK 列可正常縮減
-- 1. 刪除主鍵約束(自動刪除聚集索引)
ALTER TABLE T DROP CONSTRAINT PK_T;
-- 2. 修改列長度
ALTER TABLE T ALTER COLUMN col VARCHAR(5);
-- 3. 重新添加主鍵
ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (col);
| 風險點 | 應對 |
|---|---|
| 外鍵引用 | 先刪除引用該 PK 的 FK,修改完再建回 |
| 大表鎖定 | 使用 ONLINE=ON (Enterprise Edition) 或維護窗口操作 |
| 數據截斷 | 先檢查 MAX(LEN(col)) ≤ 新長度 |
| 複製表法 | 建新表→導數據→重建索引/約束→重命名(零停機) |
理解約束與索引的綁定關係,是資料庫架構師的基本功。