SQL 外來鍵約束

摘要:在本教學中,您將學習關於 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 約束建立外來鍵。

這個教學對您有幫助嗎?