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

Oracle UNIQUE 約束完全指南:創建、複合鍵、啟用禁用、與主鍵差異

     編輯:Oracle 教學

Oracle UNIQUE 約束完全指南:創建、複合鍵、啟用禁用、與主鍵差異

UNIQUE 約束確保列或列組合值唯一,允許 NULL (單列或複合鍵部分列)。本文系統講解單列/複合唯一約束創建、與主鍵核心差異、ALTER TABLE 追加、啟用禁用刪除操作,附可運行代碼與最佳實踐。

一、 唯一約束 vs 主鍵 核心差異

特性Primary KeyUnique Constraint
NULL 允許所有列 NOT NULL允許 NULL (複合鍵中部分列可為 NULL)
數量限制每表 僅一個可建 多個
隱式索引唯一 B-Tree 索引唯一 B-Tree 索引
同列重複建同列上不可同時建 PK 和 UK同上
最大列數32 列32 列

二、 創建表時定義

1. 單列唯一

CREATE TABLE tb_supplier (
  supplier_id   NUMBER NOT NULL,
  supplier_name VARCHAR2(50),
  contact_name  VARCHAR2(50),
  CONSTRAINT uk_tb_supplier_id UNIQUE (supplier_id)
);

2. 複合唯一 (多列組合唯一)

CREATE TABLE tb_products (
  product_id   NUMBER NOT NULL,
  product_name NUMBER NOT NULL,
  product_type VARCHAR2(50),
  supplier_id  NUMBER,
  CONSTRAINT uk_tb_products_id_name UNIQUE (product_id, product_name)
);

三、 ALTER TABLE 追加 (表已存在)

-- 禁用 (暫停檢查,允許重複數據入庫)
ALTER TABLE tb_supplier DISABLE CONSTRAINT uk_tb_supplier_id;

-- 啟用 (重新檢查現有數據,若有重複報錯)
ALTER TABLE tb_supplier ENABLE CONSTRAINT uk_tb_supplier_id;
-- 大表可用: ALTER TABLE tb_supplier ENABLE NOVALIDATE CONSTRAINT uk_tb_supplier_id; (跳過現有數據檢查)

-- 刪除
ALTER TABLE tb_supplier DROP CONSTRAINT uk_tb_supplier_id;
ALTER TABLE tb_products DROP CONSTRAINT uk_tb_products_id_name;

五、 實戰場景與避坑

  1. 業務主鍵 vs 代理主鍵:表通常用序列生成 ID 為 PK,業務自然鍵 (如身份證號、訂單號) 加 UNIQUE 約束。
  2. NULL 語義陷阱:UNIQUE (col) 允許多行 NULL (Oracle 視 NULL != NULL);若需強制非空,必須額外加 NOT NULL。
  3. 軟刪除表:IS_DELETED 列導致唯一鍵衝突,方案:UNIQUE (biz_key, is_deleted) 或 PARTIAL INDEX (12c+) / 函數索引 CASE WHEN is_deleted=0 THEN biz_key END。
  4. 大表新增 UK:同 CHECK 約束,採用 DISABLE → ENABLE NOVALIDATE → 清洗 → VALIDATE 分階段策略。
  5. 索引維護開銷:UK 依賴唯一索引,高頻 DML 表需評估索引維護成本。

六、 元數據查詢

SELECT constraint_name, constraint_type, table_name, status, deferrable, deferred
FROM user_constraints
WHERE constraint_type = 'U' AND table_name IN ('TB_SUPPLIER','TB_PRODUCTS');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved