在關聯式資料庫設計中,外鍵是維護資料參考完整性的核心機制。本文將系統性介紹 Oracle 資料庫中外鍵的建立、管理與實務應用,透過詳細的語法說明與範例代碼,幫助開發人員與 DBA 掌握外鍵的正確使用方式。
本文旨在示範如何在 Oracle 資料庫中有效使用外鍵約束,確保父子表之間的資料一致性與完整性。
外鍵是實現參考完整性的關鍵機制之一。形象地說,外鍵約束要求子表中特定欄位的值,必須存在於父表的對應主鍵或唯一鍵中。
外鍵可在建表時定義,也可事後透過 ALTER TABLE 陳述式新增。
CREATE TABLE table_name (
column1 datatype NULL/NOT NULL,
column2 datatype NULL/NOT NULL,
...
CONSTRAINT fk_name FOREIGN KEY (column1, column2, ...)
REFERENCES parent_table (column1, column2, ...)
);
-- 建立供應商父表
CREATE TABLE tb_supplier (
supplier_id NUMBER NOT NULL,
supplier_name VARCHAR2(50) NOT NULL,
contact_name VARCHAR2(50),
CONSTRAINT pk_supplier PRIMARY KEY (supplier_id)
);
-- 建立產品子表,關聯供應商
CREATE TABLE tb_products (
product_id NUMBER NOT NULL,
product_name VARCHAR2(100),
supplier_id NUMBER NOT NULL,
CONSTRAINT fk_products_supplier FOREIGN KEY (supplier_id)
REFERENCES tb_supplier(supplier_id)
);
DROP TABLE tb_products;
DROP TABLE tb_supplier;
CREATE TABLE tb_supplier (
supplier_id NUMBER NOT NULL,
supplier_name VARCHAR2(50) NOT NULL,
contact_name VARCHAR2(50),
CONSTRAINT pk_supplier PRIMARY KEY (supplier_id, supplier_name)
);
CREATE TABLE tb_products (
product_id NUMBER NOT NULL,
product_name VARCHAR2(100),
supplier_name VARCHAR2(50),
supplier_id NUMBER NOT NULL,
CONSTRAINT fk_products_supplier FOREIGN KEY (supplier_id, supplier_name)
REFERENCES tb_supplier(supplier_id, supplier_name)
);
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column1, column2, ...) REFERENCES parent_table (column1, column2, ...);
DROP TABLE tb_products;
DROP TABLE tb_supplier;
CREATE TABLE tb_supplier (
supplier_id NUMBER NOT NULL,
supplier_name VARCHAR2(50) NOT NULL,
contact_name VARCHAR2(50),
CONSTRAINT pk_supplier PRIMARY KEY (supplier_id, supplier_name)
);
CREATE TABLE tb_products (
product_id NUMBER NOT NULL,
product_name VARCHAR2(100),
supplier_name VARCHAR2(50),
supplier_id NUMBER NOT NULL
);
-- 事後新增複合外鍵約束
ALTER TABLE tb_products
ADD CONSTRAINT fk_products_supplier
FOREIGN KEY (supplier_id, supplier_name)
REFERENCES tb_supplier(supplier_id, supplier_name);
若在實作過程中遇到問題,或發現代碼有誤,歡迎指正交流。
聯絡信箱:david.louis.tian@outlook.com
版權聲明:轉載請註明出處。