摘要:在本教學中,您將學習關於 SQL 外來鍵,以及如何建立 FOREIGN KEY 約束來強制表格之間的關係。
SQL 外來鍵約束介紹
外來鍵是一個或一組欄位,它強制兩個表格中的資料之間存在連結。在外來鍵參照中,第一個表格的主鍵欄位(或欄位群組)會被第二個表格的欄位(或欄位群組)參照。第二個表格的欄位(或欄位群組)即成為外來鍵。
您可以使用 FOREIGN KEY 約束在建立或變更表格時建立外來鍵。讓我們來看一個簡單的範例以便更了解它。
SQL FOREIGN KEY 約束範例
請看以下 projects 和 project_assignments 表格
CREATE TABLE projects (
project_id INT AUTO_INCREMENT PRIMARY KEY,
project_name VARCHAR(255),
start_date DATE NOT NULL,
end_date DATE NOT NULL
);
CREATE TABLE project_milestones(
milestone_id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT,
milestone_name VARCHAR(100)
);
Code language: SQL (Structured Query Language) (sql)
每個專案可能會有零個或多個里程碑,而一個里程碑必須屬於一個且僅屬於一個專案。使用這些表格的應用程式必須確保在 project_milestones 表格中的每一列,在 projects 表格中都存在相對應的列。換句話說,里程碑不能在沒有專案的情況下存在。
不幸的是,使用者可能會使用用戶端工具編輯資料庫,或者如果應用程式中有錯誤,可能會在 project_milestones 表格中新增一列,而該列在 projects 表格中沒有對應的列。或者使用者可能會刪除 projects 表格中的一列,導致 project_milestones 表格中留下孤立的列。這會導致應用程式無法正常運作。
解決方案是在 project_milestones 表格中新增一個 SQL FOREIGN KEY 約束,以強制 projects 和 project_milestones 表格之間的關係。
您可以在建立表格時建立 FOREIGN KEY 約束,如下所示
CREATE TABLE project_milestones (
milestone_id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT,
milestone_name VARCHAR(100),
FOREIGN KEY (project_id)
REFERENCES projects (project_id)
);
Code language: SQL (Structured Query Language) (sql)
FOREIGN KEY 子句將 project_milestones 表格的 project_id 提升為外來鍵,該外來鍵參照 projects 表格的 project_id。
FOREIGN KEY (project_id)
REFERENCES projects (project_id)
Code language: SQL (Structured Query Language) (sql)
您可以為 FOREIGN KEY 約束指定一個名稱,如下所示
CREATE TABLE project_milestones (
milestone_id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT,
milestone_name VARCHAR(100),
CONSTRAINT fk_project FOREIGN KEY (project_id)
REFERENCES projects (project_id)
);
Code language: SQL (Structured Query Language) (sql)
fk_project 是 FOREIGN KEY 約束的名稱。
將 FOREIGN KEY 約束新增至現有表格
若要將 FOREIGN KEY 約束新增至現有表格,您可以使用 ALTER TABLE 陳述式。
ALTER TABLE table_1
ADD CONSTRAINT fk_name FOREIGN KEY (fk_key_column)
REFERENCES table_2(pk_key_column)
Code language: SQL (Structured Query Language) (sql)
假設 project_milestones 已經存在,沒有任何預先定義的外來鍵,而您想為 project_id 欄位定義一個 FOREIGN KEY 約束。為此,您可以使用以下 ALTER TABLE 陳述式
ALTER TABLE project_milestones
ADD CONSTRAINT fk_project FOREIGN KEY(project_id)
REFERENCES projects(project_id);
Code language: SQL (Structured Query Language) (sql)
移除外來鍵約束
若要移除外來鍵約束,您也可以使用 ALTER TABLE 陳述式,如下所示
ALTER TABLE table_name
DROP CONSTRAINT fk_name;
Code language: SQL (Structured Query Language) (sql)
如果您使用的是 MySQL,您可以使用更簡潔的語法,如下所示
ALTER TABLE table_name
DROP FOREIGN KEY fk_name;
Code language: SQL (Structured Query Language) (sql)
例如,要移除 fk_project 外來鍵約束,您可以使用以下陳述式
ALTER TABLE project_milestones
DROP CONSTRAINT fk_project;
Code language: SQL (Structured Query Language) (sql)
在本教學中,我們向您介紹了外來鍵的概念,並示範如何使用 SQL FOREIGN KEY 約束建立外來鍵。