在 Oracle 中為現有表添加外鍵約束,使用 ALTER TABLE ... ADD CONSTRAINT 語句。外鍵確保引用完整性,防止孤兒記錄產生。
-- 先確保父表主鍵存在
CREATE TABLE major (
major_id NUMBER(9) PRIMARY KEY,
major_name VARCHAR2(50)
);
-- 子表創建
CREATE TABLE stu_maj_cour (
number_id NUMBER(9) PRIMARY KEY,
major_id NUMBER(9) -- 外鍵列
);
-- 添加外鍵約束(建議顯式命名約束)
ALTER TABLE stu_maj_cour
ADD CONSTRAINT fk_stu_maj_cour_major
FOREIGN KEY (major_id)
REFERENCES major (major_id);
ALTER TABLE stu_maj_cour
ADD CONSTRAINT fk_stu_maj_cour_major
FOREIGN KEY (major_id)
REFERENCES major (major_id)
ON DELETE CASCADE; -- 刪除父記錄時自動刪除子記錄
注意:Oracle 不支持 ON UPDATE CASCADE。主鍵值變更需應用層手動處理或使用觸發器實現級聯更新。
| 子句 | 行為 | 適用場景 |
|---|---|---|
| 無(默認) | 父記錄被引用時禁止刪除/更新 | 嚴格業務完整性,如訂單-客戶 |
ON DELETE CASCADE | 自動刪除子記錄 | 明確從屬關係,如訂單明細-訂單主檔 |
ON DELETE SET NULL | 子記錄外鍵列置 NULL | 子記錄可獨立存在,如員工-部門(員工可無部門) |
-- 查看表的所有約束
SELECT constraint_name, constraint_type, table_name, r_constraint_name
FROM user_constraints
WHERE table_name = 'STU_MAJ_COUR';
-- 查看外鍵具體列映射
SELECT c.constraint_name, cc.column_name, c.r_constraint_name
FROM user_constraints c
JOIN user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE c.constraint_type = 'R' AND c.table_name = 'STU_MAJ_COUR';
fk_子表_父表 格式,便於數據字典檢索。DISABLE 約束,導入後 ENABLE VALIDATE 重新驗證。正確使用外鍵約束,是關系型數據庫維護數據質量的基石。