主鍵是關係型資料庫實體完整性的基石。本文系統整理 Oracle 主鍵的約束特性、建立語法、複合主鍵、與 Unique/外鍵/索引的關係,並給出自增主鍵的兩種實現範例。
| 特性 | Primary Key | Unique | Index |
|---|---|---|---|
| 表級數量限制 | 僅 1 個 | 可多個 | 可多個 |
| 允許 NULL | 所有列 NOT NULL | 允許 NULL(單列唯一) | 允許 NULL |
| 預設建立索引 | 唯一 B-tree 索引 | 唯一 B-tree 索引 | 非唯一/唯一可選 |
| 被外鍵引用 | 可 | 可 | 需為唯一索引 |
| 複合鍵前綴特性 | WHERE 條件需含首列才用索引 | 同左 | 同左 |
CREATE TABLE prim_key_test (
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(30)
);
CREATE TABLE order_item (
order_id NUMBER(10),
line_no NUMBER(3),
product_id NUMBER(10),
qty NUMBER(8,2),
CONSTRAINT pk_order_item PRIMARY KEY (order_id, line_no)
);
ALTER TABLE prim_key_test ADD CONSTRAINT pk_prim_key_test PRIMARY KEY (id);
ALTER TABLE prim_key_test DROP PRIMARY KEY;
-- 或
ALTER TABLE prim_key_test DROP CONSTRAINT pk_prim_key_test;
-- 1. 建表
CREATE TABLE prim_key_increase_test (
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(30)
);
-- 2. 建立序列
CREATE SEQUENCE prim_key_incre_sequence
MINVALUE 1
NOMAXVALUE
START WITH 1
INCREMENT BY 1
NOCYCLE
NOCACHE;
-- 3. 建立觸發器
CREATE OR REPLACE TRIGGER prim_key_trigger
BEFORE INSERT ON prim_key_increase_test
FOR EACH ROW
BEGIN
SELECT prim_key_incre_sequence.NEXTVAL INTO :NEW.id FROM dual;
END;
/
-- 4. 測試
INSERT INTO prim_key_increase_test (name) VALUES ('A');
INSERT INTO prim_key_increase_test (name) VALUES ('B');
SELECT * FROM prim_key_increase_test;
-- ID NAME
-- -- ----
-- 1 A
-- 2 B
-- 父表
CREATE TABLE dept (
deptno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(14)
);
-- 子表,引用父表主鍵
CREATE TABLE emp (
empno NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10),
deptno NUMBER(2),
CONSTRAINT fk_emp_dept FOREIGN KEY (deptno) REFERENCES dept(deptno)
);
-- 級聯刪除:刪除父表記錄時自動刪除子表關聯記錄
ALTER TABLE emp DROP CONSTRAINT fk_emp_dept;
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept
FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE CASCADE;
-- 刪除父表時保留子表但移除外鍵約束
DROP TABLE dept CASCADE CONSTRAINTS;
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-00001 | 主鍵/唯一鍵重複 | 檢查序列/觸發器邏輯、業務去重 |
| ORA-02291 | 外鍵父鍵不存在 | 先插入父表、或暫時停用約束 |
| ORA-02292 | 刪除父表有子表記錄 | 先刪子表、或加 ON DELETE CASCADE |
| ORA-02449 | 刪除被引用的主鍵/唯一鍵 | 先刪外鍵、或 CASCADE CONSTRAINTS |
主鍵設計原則:無業務含義、單列數值型、不可更新、序列產生。複合主鍵僅用於關聯表、弱實體表。外鍵約束在高併發核心交易表中常移至應用層維護,以減少鎖競爭,但必須在數據倉庫/報表層保留以保證數據質量。