摘要:本教程将向您介绍 SQL 外键以及如何创建外键约束以强制执行表之间的关系。
SQL 外键约束简介
外键是指专门用于强制执行两表中数据链接的列或列组。外键引用中,第一张表中的主键列(或列)由第二张表中的列(或列)引用。第二张表中的列(或列)即为外键。
使用创建或修改表时,可以使用 FOREIGN KEY 约束创建外键。我们举个简单的例子来加深理解。
SQL FOREIGN KEY 约束示例
请参见以下项目和项目分配表
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)
每个项目可以有 0 个或多个里程碑,同时一个里程碑必须属于一个且仅属于一个项目。使用这些表的应用程序必须确保在 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 约束创建外键。