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

Oracle 主鍵約束完整指南:建立、複合鍵、外鍵關聯與索引關係

     編輯:Oracle 資料庫相關知識

主鍵是關係型資料庫實體完整性的基石。本文系統整理 Oracle 主鍵的約束特性、建立語法、複合主鍵、與 Unique/外鍵/索引的關係,並給出自增主鍵的兩種實現範例。

一、主鍵 vs Unique vs 索引:核心差異

特性Primary KeyUniqueIndex
表級數量限制僅 1 個可多個可多個
允許 NULL所有列 NOT NULL允許 NULL(單列唯一)允許 NULL
預設建立索引唯一 B-tree 索引唯一 B-tree 索引非唯一/唯一可選
被外鍵引用可可需為唯一索引
複合鍵前綴特性WHERE 條件需含首列才用索引同左同左

二、建立主鍵語法

1. 建表時指定(列級)

CREATE TABLE prim_key_test (
  id   NUMBER(10) PRIMARY KEY,
  name VARCHAR2(30)
);

2. 建表時指定(表級,支援複合主鍵)

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)
);

3. 事後新增

ALTER TABLE prim_key_test ADD CONSTRAINT pk_prim_key_test PRIMARY KEY (id);

4. 刪除主鍵

ALTER TABLE prim_key_test DROP PRIMARY KEY;
-- 或
ALTER TABLE prim_key_test DROP CONSTRAINT pk_prim_key_test;

三、自增主鍵實現(Sequence + Trigger)

-- 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;

五、外鍵約束類型與完整性

  • 實體完整性:主鍵保證唯一、非空。
  • 参照完整性:外鍵保證子表值必須存在於父表主鍵/唯一鍵中。
  • 域完整性:Check 約束、資料型別、Not Null。
  • 用戶定義完整性:Trigger 實現複雜業務規則。

六、常見錯誤與對策

錯誤原因解決
ORA-00001主鍵/唯一鍵重複檢查序列/觸發器邏輯、業務去重
ORA-02291外鍵父鍵不存在先插入父表、或暫時停用約束
ORA-02292刪除父表有子表記錄先刪子表、或加 ON DELETE CASCADE
ORA-02449刪除被引用的主鍵/唯一鍵先刪外鍵、或 CASCADE CONSTRAINTS

主鍵設計原則:無業務含義、單列數值型、不可更新、序列產生。複合主鍵僅用於關聯表、弱實體表。外鍵約束在高併發核心交易表中常移至應用層維護,以減少鎖競爭,但必須在數據倉庫/報表層保留以保證數據質量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved