錯誤嘗試
-- 錯誤 1: Oracle/MySQL 風格
ALTER TABLE Course MODIFY COLUMN cname CHAR(20);
-- 訊息:'MODIFY' 附近有語法錯誤
-- 錯誤 2: 省略 COLUMN 關鍵字
ALTER TABLE Course MODIFY cname CHAR(20);
-- 訊息:'MODIFY' 附近有語法錯誤
正確語法
-- SQL Server / ANSI SQL 標準
ALTER TABLE Course ALTER COLUMN cname CHAR(20);
完整 ALTER COLUMN 語法
ALTER TABLE table_name
ALTER COLUMN column_name
new_data_type [ ( precision [ , scale ] ) ]
[ NULL | NOT NULL ]
[ COLLATE collation_name ]
常見修改場景範例
| 需求 | T-SQL 範例 | 注意事項 |
| 擴大字串長度 | ALTER TABLE T ALTER COLUMN C VARCHAR(100) | 安全,無資料截斷風險 |
| 縮減字串長度 | ALTER TABLE T ALTER COLUMN C VARCHAR(20) | 需確認現有資料長度 ≤ 20,否則截斷 |
| 變更數值精度 | ALTER TABLE T ALTER COLUMN C DECIMAL(18,4) | 精度縮減可能失去小數位 |
| NOT NULL → NULL | ALTER TABLE T ALTER COLUMN C INT NULL | 安全 |
| NULL → NOT NULL | ALTER TABLE T ALTER COLUMN C INT NOT NULL | 需確認無 NULL 值,否則失敗 |
| 加入 COLLATE | ALTER TABLE T ALTER COLUMN C NVARCHAR(50) COLLATE Chinese_PRC_CS_AS | 影響排序/比較,需重建索引 |
跨資料庫語法差異備忘
| 資料庫 | 修改欄位關鍵字 |
| SQL Server | ALTER COLUMN |
| Oracle | MODIFY |
| MySQL | MODIFY COLUMN / CHANGE COLUMN |
| PostgreSQL | ALTER COLUMN ... TYPE |
| DB2 | ALTER COLUMN ... SET DATA TYPE |
限制與替代方案
- 無法直接變更 Identity:需 Drop Column → Add Identity (參考文章 19987)
- 無法直接變更 PK/UK/FK 欄位型別:需先移除約束
- 大表 ALTER COLUMN 會鎖表:企業版可用
ONLINE = ON (部分操作)
- 計算欄位、Timestamp、Rowversion:不可 ALTER