首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle UNIQUE 約束與 DISTINCT 去重完整解析

     編輯:Oracle 資料庫相關知識

UNIQUE 約束 vs PRIMARY KEY

特性PRIMARY KEYUNIQUE
唯一性✓✓
允許 NULL✗ (隱含 NOT NULL)✓ (單欄最多一 NULL,複合欄全 NULL 視為相同)
自動建立索引✓ (叢集索引/一般索引視版本)✓ (非叢集索引)
可被外鍵參考✓✓ (需被參考欄位有 UNIQUE/PK)
每張表數量1多個

建立 UNIQUE 約束語法

欄位級 (單欄)

CREATE TABLE employees (
  empno NUMBER(5) PRIMARY KEY,
  email VARCHAR2(100) UNIQUE,           -- 系統自動命名
  phone VARCHAR2(20) CONSTRAINT uk_emp_phone UNIQUE  -- 指定名稱
);

表級 (單欄或複合欄)

CREATE TABLE purchase (
  product_name VARCHAR2(25),
  quantity     NUMBER(4,2),
  purchase_date DATE,
  salesperson  VARCHAR2(3),
  CONSTRAINT uk_purchase_prod_date UNIQUE (product_name, purchase_date)  -- 複合唯一
);

DISTINCT vs UNIQUE (查詢關鍵字)

在 `SELECT` 中,`UNIQUE` 是 `DISTINCT` 的同義字 (Oracle 相容語法),功能完全相同:回傳不重複的資料列組合。

實戰範例

-- 建立測試表
CREATE TABLE purchase (
  product_name VARCHAR2(25),
  quantity     NUMBER(4,2),
  purchase_date DATE,
  salesperson  VARCHAR2(3)
);

-- 插入含重複產品資料
INSERT INTO purchase VALUES ('a', 1,   DATE '2003-07-14', 'ca');
INSERT INTO purchase VALUES ('b', 75,  DATE '2003-07-14', 'bb');
INSERT INTO purchase VALUES ('c', 2,   DATE '2003-07-14', 'ga');
INSERT INTO purchase VALUES ('d', 8,   DATE '2003-07-15', 'ga');
INSERT INTO purchase VALUES ('a', 20,  DATE '2003-07-15', 'lb');  -- 重複 a
INSERT INTO purchase VALUES ('b', 2,   DATE '2003-07-16', 'ca');  -- 重複 b
INSERT INTO purchase VALUES ('c', 25,  DATE '2003-07-16', 'lb');  -- 重複 c
INSERT INTO purchase VALUES ('d', 2,   DATE '2003-07-17', 'bb');  -- 重複 d
COMMIT;

-- DISTINCT 去重 (僅看 product_name)
SELECT DISTINCT product_name FROM purchase ORDER BY product_name;
-- 或
SELECT UNIQUE product_name FROM purchase ORDER BY product_name;

-- 結果
PRODUCT_NAME
------------
a
b
c
d

進階:COUNT(DISTINCT ...) 統計不重複值

SELECT coder,
       COUNT(DISTINCT course) AS distinct_courses,
       COUNT(*) AS total_rows
FROM offerings
GROUP BY coder;

-- 結果範例
CODER DISTINCT_COURSES TOTAL_ROWS
----- ---------------- ----------
1     2                3
4     2                2
8     2                2
11    1                1
13    2                2

效能提醒

  • `DISTINCT`/`UNIQUE` 需執行排序去重,大量資料耗資源。
  • 若僅需統計筆數,考慮 `APPROX_COUNT_DISTINCT` (12c+) 近似算法,效能極佳。
  • 建立 `UNIQUE` 索引可加速去重查詢 (索引全掃描避免排序)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved