SQL 外键约束

摘要:本教程将向您介绍 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 约束创建外键。

本教程是否有帮助?