SQL 外键:如何在 SQL Server 中创建(附示例)
什么是外键 (FOREIGN KEY)?
外键提供了一种在 SQL Server 中强制实施引用完整性的方法。简单来说,外键确保一个表中的值必须存在于另一个表中。
外键规则
- SQL 外键允许 NULL 值。
- 被引用的表称为父表。
- 在 SQL 中拥有外键的表称为子表。
- 子表中的 SQL 外键引用父表中的主键。
- 这种父子关系强制执行称为“引用完整性”的规则。
下面带有图示的 SQL 外键示例总结了关于外键的所有上述要点。

如何在 SQL 中创建外键
我们可以在 SQL Server 中通过两种方式创建外键:
- SQL Server Management Studio
- T-SQL
SQL Server Management Studio
父表:假设我们有一个现有的名为“Course”的父表。Course_ID 和 Course_name 是两个列,其中 Course_Id 是主键。
子表:我们需要创建第二个表作为子表。包含“Course_ID”和“Course_Strength”两列。但是,“Course_ID”应为外键。
步骤 1) 右键单击“表”>“新建”>“表…”
步骤 2) 输入两列名称,分别为“Course_ID”和“Course_Strength”。右键单击“Course_Id”列。然后单击“关系”。
步骤 3) 在“外键关系”中,单击“添加”
步骤 4) 在“表和列规范”中,单击“...”图标
步骤 5) 从下拉列表中选择“主键表”为“COURSE”,将新创建的表选为“外键表”。
步骤 6) “主键表”– 选择“Course_Id”列作为“主键表”列。
“外键表”– 选择“Course_Id”列作为“外键表”列。单击“确定”。
步骤 7) 单击添加。
步骤 8) 将表名命名为“Course_Strength”并单击“确定”。
结果:我们在“Course”和“Course_strength”之间建立了父子关系。
T-SQL:使用 T-SQL 创建父子表
父表:再考虑一下,我们有一个现有的父表,表名为“Course”。
Course_ID 和 Course_name 是两列,其中 Course_Id 是主键。
子表:我们需要创建第二个表作为子表,名称为“Course_Strength_TSQL”。
为子表 Course_Strength_TSQL 包含“Course_ID”和“Course_Strength”两列。但是,“Course_ID”应为外键。
下面是创建带外键的表的语法
语法
CREATE TABLE childTable ( column_1 datatype [ NULL |NOT NULL ], column_2 datatype [ NULL |NOT NULL ], ... CONSTRAINT fkey_name FOREIGN KEY (child_column1, child_column2, ... child_column_n) REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n) [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] );
以下是对上述参数的说明
- childTable 是要创建的表的名称。
- column_1, column_2 – 要添加到表中的列。
- fkey_name – 要创建的外键约束的名称。
- child_column1, child_column2…child_column_n – 子表列的名称,用于引用父表中的主键。
- parentTable – 父表的名称,其键将在子表中被引用。
- parent_column1, parent_column2, … parent_column3 – 构成父表主键的列。
- ON DELETE。一个可选参数。它指定在删除父数据后对子数据做什么。此参数的一些值包括 NO ACTION、SET NULL、CASCADE 或 SET DEFAULT。
- ON UPDATE – 一个可选参数。它指定在父数据更新后对子数据做什么。此参数的一些值包括 NO ACTION、SET NULL、CASCADE 或 SET DEFAULT。
- NO ACTION – 与 ON DELETE 和 ON UPDATE 一起使用。它意味着在删除或更新父数据后,子数据不会发生任何变化。
- CASCADE – 与 ON DELETE 和 ON UPDATE 一起使用。在父数据被删除或更新后,子数据将被删除或更新。
- SET NULL – 与 ON DELETE 和 ON UPDATE 一起使用。在父数据被更新或删除后,子数据将被设置为 NULL。
- SET DEFAULT – 与 ON DELETE 和 ON UPDATE 一起使用。在对父数据进行更新或删除后,子数据将被设置为默认值。
让我们看一个 SQL 外键示例,以创建一个将一个列作为外键的表
SQL 中的外键示例
查询
CREATE TABLE Course_Strength_TSQL ( Course_ID Int, Course_Strength Varchar(20) CONSTRAINT FK FOREIGN KEY (Course_ID) REFERENCES COURSE (Course_ID) )
步骤 1) 单击执行运行查询。
结果:我们在“Course”和“Course_strength_TSQL”之间建立了父子关系。
使用 ALTER TABLE
现在,我们将学习如何在 SQL 中使用外键,并使用下面的语法使用 ALTER TABLE 语句将外键添加到 SQL Server 中。
ALTER TABLE childTable ADD CONSTRAINT fkey_name FOREIGN KEY (child_column1, child_column2, ... child_column_n) REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);
以下是对上述参数的说明
- childTable 是要创建的表的名称。
- column_1, column_2 – 要添加到表中的列。
- fkey_name – 要创建的外键约束的名称。
- child_column1, child_column2…child_column_n – 子表列的名称,用于引用父表中的主键。
- parentTable – 父表的名称,其键将在子表中被引用。
- parent_column1, parent_column2, … parent_column3 – 构成父表主键的列。
Alter table add Foreign Key 示例
ALTER TABLE department ADD CONSTRAINT fkey_student_admission FOREIGN KEY (admission) REFERENCES students (admission);
我们在 department 表上创建了一个名为 fkey_student_admission 的外键。此外键引用 students 表的 admission 列。
示例查询外键
首先,让我们看一下我们的父表数据,COURSE。
查询
SELECT * from COURSE;
现在,让我们向子表:“Course_strength_TSQL”插入一些行。
我们将尝试插入两种类型的行
- 第一种类型,其中子表中的 Course_Id 存在于父表的 Course_Id 中。即 Course_Id = 1 和 2
- 第二种类型,其中子表中的 Course_Id 不存在于父表的 Course_Id 中。即 Course_Id = 5
查询
Insert into COURSE_STRENGTH values (1,'SQL'); Insert into COURSE_STRENGTH values (2,'Python'); Insert into COURSE_STRENGTH values (5,'PERL');
结果:让我们一起运行查询,看看我们的父表和子表。
Course_strength 表中存在 Course_ID 为 1 和 2 的行。而 Course_ID 5 是一个例外。
摘要
- 外键的每个值都必须是其他表主键的一部分。
- MySQL 外键可以引用同一表中的另一个列。这种引用称为自引用。
- SQL 外键约束:用于保护表之间的链接,并防止无效数据插入外键列。
- 您可以使用 Create Table、Alter Table 或 SQL Server Management Studio 创建外键。
- 主键与外键的区别:点击这里