UNIQUE 約束確保列或列組合值唯一,允許 NULL (單列或複合鍵部分列)。本文系統講解單列/複合唯一約束創建、與主鍵核心差異、ALTER TABLE 追加、啟用禁用刪除操作,附可運行代碼與最佳實踐。
| 特性 | Primary Key | Unique Constraint |
|---|---|---|
| NULL 允許 | 所有列 NOT NULL | 允許 NULL (複合鍵中部分列可為 NULL) |
| 數量限制 | 每表 僅一個 | 可建 多個 |
| 隱式索引 | 唯一 B-Tree 索引 | 唯一 B-Tree 索引 |
| 同列重複建 | 同列上不可同時建 PK 和 UK | 同上 |
| 最大列數 | 32 列 | 32 列 |
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) );
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 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;
ID 為 PK,業務自然鍵 (如身份證號、訂單號) 加 UNIQUE 約束。UNIQUE (col) 允許多行 NULL (Oracle 視 NULL != NULL);若需強制非空,必須額外加 NOT NULL。IS_DELETED 列導致唯一鍵衝突,方案:UNIQUE (biz_key, is_deleted) 或 PARTIAL INDEX (12c+) / 函數索引 CASE WHEN is_deleted=0 THEN biz_key END。DISABLE → ENABLE NOVALIDATE → 清洗 → VALIDATE 分階段策略。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');