在本教學中,將學習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_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)
假設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
約束創建和刪除外鍵。