六大約束類型概覽
| 約束類型 | 支援層級 | 可命名 | 備註 |
| NOT NULL | 僅欄位級 | 不可 | |
| DEFAULT | 僅欄位級 | 不可 | Oracle 不視為正式約束,USER_CONSTRAINTS 查不到 |
| PRIMARY KEY | 欄位級/表級 | 可 | |
| UNIQUE | 欄位級/表級 | 可 | |
| CHECK | 欄位級/表級 | 可 | |
| FOREIGN KEY | 欄位級/表級 | 可 | 跨表參考時必須用表級 |
四大核心原則
- NOT NULL、DEFAULT 僅能建立為欄位級約束
- 其餘四種可建立為欄位級或表級
- 涉及多欄位的約束(複合鍵)只能建立為表級
- 四種可命名約束(PK、UK、CK、FK)皆可指定名稱;NOT NULL、DEFAULT 不可命名
以 PRIMARY KEY 為例的六種建立方式
1. 建表時欄位級(無名稱)
CREATE TABLE t1 (tid NUMBER PRIMARY KEY);
2. 建表時欄位級(指定名稱)
CREATE TABLE t1 (tid NUMBER CONSTRAINT pk_tid PRIMARY KEY);
3. ALTER TABLE 修改欄位(欄位級,無名稱)
CREATE TABLE t2 (tid NUMBER);
ALTER TABLE t2 MODIFY tid PRIMARY KEY;
-- 或
ALTER TABLE t2 MODIFY tid NUMBER PRIMARY KEY;
4. 建表時表級(無名稱)
CREATE TABLE t3 (tid NUMBER, PRIMARY KEY (tid));
5. 建表時表級(指定名稱)
CREATE TABLE t3 (tid NUMBER, CONSTRAINT pk_t3id PRIMARY KEY (tid));
6. ALTER TABLE ADD 表級約束(可指定名稱)
CREATE TABLE t4 (tid NUMBER);
ALTER TABLE t4 ADD PRIMARY KEY (tid);
-- 或指定名稱
ALTER TABLE t4 ADD CONSTRAINT pk_t4id PRIMARY KEY (tid);
實務命名慣例建議
| 約束類型 | 前綴 | 範例 |
| PRIMARY KEY | PK_ | PK_EMP_EMPNO |
| FOREIGN KEY | FK_ | FK_EMP_DEPTNO |
| UNIQUE | UK_ | UK_EMP_EMAIL |
| CHECK | CK_ | CK_EMP_SAL_MIN |
命名優點:錯誤訊息可直接識別違反哪個約束,利於除錯與文件化。
常見陷阱提醒
- DEFAULT 非真正約束:不會出現在
USER_CONSTRAINTS,僅存於 USER_TAB_COLUMNS.DATA_DEFAULT。
- 啟用/停用約束:
ALTER TABLE ... ENABLE/DISABLE CONSTRAINT ...,停用 FK 可大幅加快大量載入速度,載入後再啟用並驗證。
VALIDATE/NOVALIDATE:ENABLE NOVALIDATE 適合歷史資料不合規但新資料需合規的場景。