Oracle 主鍵約束特性:單一表僅一個、隱含 NOT NULL、自動建立唯一索引。本文示範自增主鍵與手動指定唯一序列兩種常見模式。
-- 建表
CREATE TABLE pk_inc_test (
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(30)
);
-- 建立 Sequence(注意關鍵字 INCREMENT BY)
CREATE SEQUENCE pk_inc_seq
MINVALUE 1
NOMAXVALUE
START WITH 1
INCREMENT BY 1
NOCYCLE
NOCACHE;
-- 建立 Trigger
CREATE OR REPLACE TRIGGER pk_inc_trg
BEFORE INSERT ON pk_inc_test
FOR EACH ROW
BEGIN
SELECT pk_inc_seq.NEXTVAL INTO :NEW.id FROM dual;
END;
/
-- 測試:指定 id 會被 Trigger 覆蓋
INSERT INTO pk_inc_test (id) VALUES (181); -- 實際寫入 1
INSERT INTO pk_inc_test (id) VALUES (181); -- 實際寫入 2
INSERT INTO pk_inc_test (id) VALUES (181); -- 實際寫入 3
CREATE TABLE pk_manual (
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(30)
);
-- 應用層自行取號:SELECT pk_manual_seq.NEXTVAL FROM dual;
INSERT INTO pk_manual (id, name) VALUES (pk_manual_seq.NEXTVAL, 'Alice');
| 特性 | Primary Key | Unique |
|---|---|---|
| 每表數量 | 1 | 多個 |
| 允許 NULL | 否 | 是(單欄) |
| 自動建索引 | 是 | 是 |
| 外鍵參考對象 | 是 | 是 |
WHERE pk_col1 = :v1 AND pk_col2 = :v2 可用索引;WHERE pk_col2 = :v2 無法使用(無前導欄)。
ON DELETE CASCADE:刪父記錄自動刪子記錄。ON DELETE SET NULL:子表外鍵設 NULL(需欄位允許 NULL)。DROP TABLE parent CASCADE CONSTRAINTS 移除子表外鍵、保留資料。自增主鍵適合代理鍵;業務鍵(如身分證號、訂單號)宜採手動指定,保留語義可讀性。