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