約束定義層級原則
- 單欄位約束:可在欄位級或表級定義
- 多欄位組合約束:必須在表級定義
- 使用
CONSTRAINT 命名,未指定時系統自動產生 SYS_Cxxxxx 形式名稱
Primary Key (PK) 約束
欄位級定義
CREATE TABLE employees (
empno NUMBER(5) PRIMARY KEY,
...
);
-- 指定名稱
CREATE TABLE employees (
empno NUMBER(5) CONSTRAINT emp_pk PRIMARY KEY,
...
);
表級定義 (組合 PK)
CREATE TABLE employees (
empno NUMBER(5),
deptno NUMBER(3) NOT NULL,
CONSTRAINT emp_pk PRIMARY KEY (empno, deptno)
USING INDEX TABLESPACE indx
STORAGE (INITIAL 64K NEXT 64K)
);
PK 特性
- 自動建立唯一索引 + NOT NULL 約束
- 可指定索引表空間與儲存參數
ALTER TABLE ... ADD PRIMARY KEY / ADD CONSTRAINT ... PRIMARY KEY
NOT NULL 約束
- 僅能在欄位級定義
- 同表可定義多個 NOT NULL
- 修改:
ALTER TABLE employees MODIFY deptno NOT NULL / NULL;
Unique (UK) 約束
-- 欄位級
email VARCHAR2(30) UNIQUE
-- 表級 (組合 UK)
CONSTRAINT emp_ename_phone_uk UNIQUE (ename, phone)
-- ALTER 新增
ALTER TABLE employees ADD CONSTRAINT emp_uk UNIQUE (ename, phone)
USING INDEX TABLESPACE indx;
- 禁止重複值,允許 NULL (多筆 NULL 視為不重複)
- 可在欄位級或表級定義
- 自動建立唯一索引
Foreign Key (FK) 約束
- FK 欄位值必須存在於參照表 PK/UK 中,或為 NULL
- 可定義單欄或組合 FK
- 支援自參照 (FK 與參照 PK 在同一表)
- 可與 NOT NULL 共存 (強制必須有父記錄)
CHECK 約束
-- 欄位級
sal NUMBER(7,2) CONSTRAINT emp_sal_ck1 CHECK (sal > 0)
-- 表級 / ALTER 新增
ALTER TABLE employees ADD CONSTRAINT emp_sal_ck2 CHECK (sal < 20000);
- 運算式必須引用表中欄位,結果為 Boolean
- 同欄位可定義多個 CHECK,可與 NOT NULL 共存
約束管理操作
| 操作 | 語法 |
| 刪除 (指定內容) | ALTER TABLE dept DROP UNIQUE (dname, loc) |
| 刪除 (指定名稱) | ALTER TABLE dept DROP CONSTRAINT dept_dname_loc_uk |
| 刪除並保留索引 | ALTER TABLE ... DROP CONSTRAINT ... KEEP INDEX |
| 級聯刪除參照約束 | ALTER TABLE dept DROP PRIMARY KEY CASCADE |
| 停用/啟用 | ALTER TABLE ... DISABLE/ENABLE CONSTRAINT ... |
| 級聯停用 FK | ALTER TABLE ... DISABLE PRIMARY KEY CASCADE |
約束資料字典
USER/ALL/DBA_CONSTRAINTS:約束基本資訊 (類型:C=CHECK, P=PK, R=FK, U=UK、狀態)
USER/ALL/DBA_CONS_COLUMNS:約束對應欄位資訊
- 上一篇文章: Oracle WHERE 子句索引使用鐵律:型別轉換、失效模式與資源耗盡操作避坑指南
- 下一篇文章: Oracle 索引建立策略與類型全解析:B-Tree、Bitmap、Reverse、Function-Based 實戰語法
Copyright ©
程式碼之家 All Rights Reserved