SQL外來鍵


在本教學中,將學習SQL外來鍵以及如何建立FOREIGN KEY約束以強制表之間的關係。

1. SQL外來鍵約束簡介

外來鍵是一列或一組列,用於強制兩個表中的資料之間的連結。 在外來鍵參照中,第一個表的主鍵列(或多個列)由第二個表的列(或列)參照。 第二個表的列(或列)成為外來鍵。

在建立或更改表時,可以使用FOREIGN KEY約束建立外來鍵。 下面來看一個簡單的例子以更好地理解。

2. SQL FOREIGN KEY約束範例

請參閱以下project表和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)
);

每個專案可能有零個或多個里程碑,而一個里程碑必須屬於一個且只有一個專案。 使用這些表的應用程式必須確保project_milestones表中的每一行都在projects表中存在相應的行。 換句話說,沒有專案就不可能存在里程碑。

不幸的是,使用者可能使用用戶端工具編輯資料庫,或者如果應用程式中存在錯誤,則可能會在project_milestones表中新增一行,該行不對應於專案表中的任何行。 或者使用者可以刪除專案表中的行,在project_milestones表中留下孤立的行。 這會導致應用程式無法正常工作。

解決方案是向project_milestones表新增SQL FOREIGN KEY約束,以強制執行project表和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)
);

FOREIGN KEY子句將project_milestones表的project_id設定為參照project表的project_id列的外來鍵。

FOREIGN KEY (project_id)
        REFERENCES projects (project_id)

可以為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)
);

hk_projectFOREIGN 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)

假設project_milestones列已經存在,但是沒有任何預定義的外來鍵,如果想要為project_id列定義FOREIGN KEY約束。 為此,請使用以下ALTER TABLE語句:

ALTER TABLE project_milestones
ADD CONSTRAINT fk_project FOREIGN KEY(project_id)
   REFERENCES projects(project_id);

3. 刪除外來鍵約束

要刪除外來鍵約束,還要使用ALTER TABLE語句,如下所示:

ALTER TABLE table_name
DROP CONSTRAINT fk_name;

如果使用的是MySQL,則可以使用更清晰的語法,如下所示:

ALTER TABLE table_name
DROP FOREIGN KEY fk_name;

例如,要刪除fk_project外來鍵約束,請使用以下語句:

ALTER TABLE project_milestones
DROP CONSTRAINT fk_project;

在本教學中,我們介紹了外來鍵概念,並演示了如何使用SQL FOREIGN KEY約束建立和刪除外來鍵。