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

Oracle UNIQUE 約束建立與管理完整指南

     編輯:Oracle 資料庫基礎

掌握唯一性約束的建立時機、語法與 NULL 值特殊行為

UNIQUE 約束確保欄位或欄位組合值不重複,是資料完整性核心機制。本文詳細說明建表時與事後新增兩種建立方式、單欄與複合約束差異、NULL 值處理邏輯、錯誤代碼解讀與管理最佳實務。

建立 UNIQUE 約束兩種方式

1. 建表時定義 (推薦)

CREATE TABLE unique_test (
  id NUMBER,
  fname VARCHAR2(20),
  lname VARCHAR2(20),
  address VARCHAR2(100),
  email VARCHAR2(40),
  CONSTRAINT name_unique UNIQUE (fname, lname)  -- 複合唯一約束
);

2. 事後新增 (ALTER TABLE)

ALTER TABLE unique_test
ADD CONSTRAINT email_unique UNIQUE (email);

實戰驗證:複合約束與 NULL 值行為

-- 插入第一筆:劉德華
INSERT INTO unique_test (id, fname, lname) VALUES (1, '德華', '劉');  -- 成功

-- 插入重複複合值:再次劉德華
INSERT INTO unique_test (id, fname, lname) VALUES (2, '德華', '劉');  
-- ORA-00001: unique constraint (SYS.NAME_UNIQUE) violated

-- 插入不同複合值:張學友
INSERT INTO unique_test (id, fname, lname) VALUES (2, '學友', '張');  -- 成功

-- 插入 NULL email (兩筆皆無 email)
INSERT INTO unique_test (id, fname, lname, email) VALUES (3, 'A', 'B', NULL);  -- 成功
INSERT INTO unique_test (id, fname, lname, email) VALUES (4, 'C', 'D', NULL);  -- 成功! 不違反 UNIQUE

核心知識點:NULL ≠ NULL

  • Oracle 中 NULL 代表「值不存在」,不參與相等比較
  • 因此多筆 NULL 不違反 UNIQUE 約束
  • 若需強制單一 NULL,需搭配 CHECK 約束或虛擬欄位 (11g+)

約束管理實用查詢

-- 查看表的所有約束
SELECT constraint_name, constraint_type, search_condition, status
FROM user_constraints WHERE table_name = 'UNIQUE_TEST';

-- 查看約束包含欄位
SELECT constraint_name, column_name, position
FROM user_cons_columns WHERE table_name = 'UNIQUE_TEST';

啟用/停用/刪除約束

-- 停用 (大量載入資料時)
ALTER TABLE unique_test DISABLE CONSTRAINT email_unique;

-- 啟用並驗證現有資料
ALTER TABLE unique_test ENABLE VALIDATE CONSTRAINT email_unique;

-- 僅啟用不驗證現有資料 (風險自負)
ALTER TABLE unique_test ENABLE NOVALIDATE CONSTRAINT email_unique;

-- 刪除約束
ALTER TABLE unique_test DROP CONSTRAINT email_unique;

UNIQUE vs PRIMARY KEY 差異對照

特性PRIMARY KEYUNIQUE
每張表數量僅一個可多個
允許 NULL不允許允許 (多筆)
預設索引唯一索引唯一索引
外鍵參考可被參考可被參考

最佳實務建議

  • 業務鍵 (如身分證號、Email、產品編號) 必須加 UNIQUE 約束
  • 複合唯一約束欄位順序:選擇性最高的欄位放前面,索引效能最佳
  • 命名規範:UK_表名_欄位 或 UK_表名_欄位1_欄位2
  • 大量匯入資料前 DISABLE 約束,匯入後 ENABLE VALIDATE,效能提升數倍
  • 定期檢查 DBA_CONSTRAINTS.STATUS = 'DISABLED' 異常狀態

正確使用 UNIQUE 約束是防止髒資料、保障業務鍵唯一性的第一道防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved