
- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 截斷表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表
- SQL - 約束
- SQL 查詢
- SQL - 插入查詢
- SQL - 選擇查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查詢
- SQL - 刪除查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION 與 UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - 刪除連線
- SQL - 更新連線
- SQL - 左連線與右連線
- SQL - UNION 與 JOIN
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 組合鍵
- SQL - 備選鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 叢集索引
- SQL - 非叢集索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - 檢查約束
- SQL - 預設約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - GROUP BY 與 ORDER BY
- SQL - IN 與 EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
SQL - 外部索引鍵
SQL 外部索引鍵
在 SQL 中,外部索引鍵是表中的一列,它與另一表中的主鍵匹配,從而允許將這兩個表連線在一起。
外部索引鍵還維護兩個表之間的參照完整性,使得無法刪除包含主鍵的表(保留表之間的連線)。
外部索引鍵可以引用資料庫中任何表的唯一欄位。具有主鍵的表稱為父表,具有外部索引鍵的表稱為子表。
讓我們考慮一個示例場景,假設我們有兩個表,名為 CUSTOMERS (ID, NAME, AGE, ADDRES, SALARY) 和 ORDERS (ID, DATE, CUSTOMER_ID, AMOUNT)。這裡客戶的 ID 是 CUSTOMERS 表中的主鍵 (ID),也是 ORDERS (CUSTOMER_ID) 表中的外部索引鍵,請觀察下圖:

外部索引鍵的特性
以下是外部索引鍵的特性:
外部索引鍵用於減少表中的冗餘(或重複)。
它有助於規範化(或組織資料庫中的資料)多個表中的資料。
語法
以下是為 MySQL 資料庫中表的列新增外部索引鍵約束的基本語法:
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... CONSTRAINT fk_name FOREIGN KEY (column_name) REFERENCES referenced_table(referenced_column) );
示例
讓我們建立兩個名為 CUSTOMERS 和 ORDERS 的表。以下查詢建立一個名為 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
輸出
以下是上述 SQL 語句的輸出:
Query OK, 0 rows affected (0.02 sec)
現在,讓我們建立 ORDERS 表。在此過程中,我們在 CUSTOMER_ID 列上新增外部索引鍵約束,引用 CUSTOMERS 表的 ID 列,如下面的語句所示:
CREATE TABLE ORDERS ( ID INT NOT NULL, DATE DATETIME, CUSTOMER_ID INT, CONSTRAINT FK_CUSTOMER FOREIGN KEY(CUSTOMER_ID) REFERENCES CUSTOMERS(ID), AMOUNT DECIMAL, PRIMARY KEY (ID) );
輸出
上述語句產生以下輸出:
Query OK, 0 rows affected (0.04 sec)
驗證
我們在 ORDERS 表的 CUSTOMER_ID 列上建立了一個外部索引鍵約束,該約束引用了 CUSTOMERS 表的 ID 列;因此,在刪除 table2 (ORDERS) 之前,不能刪除 table1 (CUSTOMERS)。
首先,讓我們使用 DROP TABLE 語句刪除 CUSTOMERS 表而不刪除 ORDERS 表:
DROP TABLE CUSTOMERS;
如果您驗證下面的錯誤訊息,您會發現它指出該表無法刪除,因為它被外部索引鍵約束引用。
ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'FK_CUSTOMER' on table 'orders'.
現有列上的外部索引鍵約束
我們還可以為現有表的列建立外部索引鍵約束。當您在建立表時忘記為列新增外部索引鍵約束,或者即使表中存在一個外部索引鍵列,也希望在此列上新增此約束時,這很有用。
語法
使用 ALTER TABLE 語句,我們可以如下所示在 MySQL 資料庫中表的現有列上新增外部索引鍵約束:
ALTER TABLE TABLE2 ADD CONSTRAINT[symbol] FOREIGN KEY(column_name) REFERENCES TABLE1(column_name);
這裡,FK_ORDERS 是外部索引鍵約束的名稱。指定約束名稱是可選的,但在刪除約束時非常方便。
示例
假設 CUSTOMERS 和 ORDERS 表已在 SQL 資料庫中建立。現在,我們將為 ORDERS 表的 ID 列新增外部索引鍵約束。
以下是為現有表的列新增外部索引鍵約束的 SQL 查詢:
ALTER TABLE ORDERS ADD CONSTRAINT FK_ORDERS FOREIGN KEY(ID) REFERENCES CUSTOMERS(ID);
輸出
以下是上述程式的輸出:
Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
驗證
我們在 ORDERS 表的 CUSTOMER_ID 列上建立了一個外部索引鍵約束,該約束引用了 CUSTOMERS 表的 ID 列。因此,在刪除 table2 (ORDERS) 之前,不能刪除 table1 (CUSTOMERS)。
首先,讓我們透過執行以下語句刪除 CUSTOMERS 表而不刪除 ORDERS 表:
DROP TABLE CUSTOMERS;
這會生成一條錯誤訊息,指出該表無法刪除,因為它被外部索引鍵約束引用。
ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'FK_CUSTOMER' on table 'orders'.
刪除外部索引鍵
您可以使用 ALTER TABLE 語句從表中刪除外部索引鍵,而無需刪除整個表。
語法
以下是使用 ALTER TABLE 語句從表的列中刪除外部索引鍵約束的語法:
ALTER TABLE table_name DROP FOREIGN KEY (constraint symbol);
其中,FK_NAME 是您需要刪除的外部索引鍵約束的名稱。
示例
刪除表列外部索引鍵約束的 SQL 查詢如下:
ALTER TABLE ORDERS DROP FOREIGN KEY FK_ORDERS;
輸出
以下是上述 SQL 查詢的輸出:
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
驗證
由於我們已從 ORDERS 表中刪除了外部索引鍵約束,因此您現在可以直接刪除 CUSTOMERS 表而不刪除 ORDERS 表,如下所示:
DROP TABLE CUSTOMERS;
如果您驗證上述 SQL 命令丟擲的以下狀態程式碼,您會發現 CUSTOMERS 表已刪除。
Query OK, 0 rows affected (0.02 sec)
主鍵與外部索引鍵
即使主鍵和外部索引鍵都引用同一列,它們的工作方式也存在許多差異。這些差異列在下面:
主鍵 | 外部索引鍵 |
---|---|
主鍵總是唯一的。 | 外部索引鍵可以重複。 |
主鍵不能為 NULL。 | 外部索引鍵可以為 NULL。 |
一個表只能包含一個主鍵。 | 每個表可以有多個外部索引鍵。 |