首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 約束完整指南:PK、UK、FK、NOT NULL、CHECK 定義、管理與資料字典

     編輯:Oracle 資料庫基礎

約束定義層級原則

  • 單欄位約束:可在欄位級或表級定義
  • 多欄位組合約束:必須在表級定義
  • 使用 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 共存

約束管理操作

約束資料字典

  • USER/ALL/DBA_CONSTRAINTS:約束基本資訊 (類型:C=CHECK, P=PK, R=FK, U=UK、狀態)
  • USER/ALL/DBA_CONS_COLUMNS:約束對應欄位資訊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作語法
刪除 (指定內容)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 ...
級聯停用 FKALTER TABLE ... DISABLE PRIMARY KEY CASCADE