Oracle 約束 是資料完整性的最後一道防線。本文系統整理六大約束類型、列級與表級兩種定義層級、四種新增時機,並以主鍵為例展示八種寫法,供開發與 DBA 快速查閱。
| 約束 | 用途 | 可命名 | 層級 |
|---|---|---|---|
| NOT NULL | 欄位不可為空 | 否 | 僅列級 |
| DEFAULT | 預設值(非標準約束,不在 user_constraints) | 否 | 僅列級 |
| PRIMARY KEY | 唯一識別列,隱含 NOT NULL + UNIQUE | 是 | 列級/表級 |
| UNIQUE | 值唯一,允許一個 NULL | 是 | 列級/表級 |
| CHECK | 自訂條件檢核 | 是 | 列級/表級 |
| FOREIGN KEY | 參考完整性 | 是 | 列級/表級 |
CREATE TABLE t1 (id NUMBER PRIMARY KEY);CREATE TABLE t3 (id NUMBER, PRIMARY KEY (id));ALTER TABLE t2 MODIFY id PRIMARY KEY;ALTER TABLE t4 ADD PRIMARY KEY (id);-- 1. 建表列級(無名)
CREATE TABLE t1 (tid NUMBER PRIMARY KEY);
-- 2. 建表列級(有名)
CREATE TABLE t1 (tid NUMBER CONSTRAINT pk_tid PRIMARY KEY);
-- 3. 建表後 ALTER MODIFY 列級(無名)
CREATE TABLE t2 (tid NUMBER);
ALTER TABLE t2 MODIFY tid PRIMARY KEY;
-- 4. 建表後 ALTER MODIFY 列級(有名)
ALTER TABLE t2 MODIFY tid CONSTRAINT pk_t2id PRIMARY KEY;
-- 5. 建表表級(無名)
CREATE TABLE t3 (tid NUMBER, PRIMARY KEY (tid));
-- 6. 建表表級(有名)
CREATE TABLE t3 (tid NUMBER, CONSTRAINT pk_t3id PRIMARY KEY (tid));
-- 7. 建表後 ALTER ADD 表級(無名)
CREATE TABLE t4 (tid NUMBER);
ALTER TABLE t4 ADD PRIMARY KEY (tid);
-- 8. 建表後 ALTER ADD 表級(有名)
ALTER TABLE t4 ADD CONSTRAINT pk_t4id PRIMARY KEY (tid);
PK_表名、FK_子表_父表、UK_表名_欄位、CK_表名_用途,利於後續管理與錯誤訊息辨識。ALTER TABLE ... ADD CONSTRAINT,閱讀性最佳。ALTER TABLE ... DISABLE/ENABLE CONSTRAINT ... 保留中繼資料,大量載資料時效能更好。SELECT constraint_name, constraint_type, status FROM user_constraints WHERE table_name = '...';掌握六大類型、兩種層級、四種時機、八種寫法,即能在任何情境下精準、規範地建立 Oracle 約束,守護資料品質。