SQL 外键:如何在 SQL Server 中创建(附示例)

什么是外键 (FOREIGN KEY)?

外键提供了一种在 SQL Server 中强制实施引用完整性的方法。简单来说,外键确保一个表中的值必须存在于另一个表中。

外键规则

  • SQL 外键允许 NULL 值。
  • 被引用的表称为父表。
  • 在 SQL 中拥有外键的表称为子表。
  • 子表中的 SQL 外键引用父表中的主键。
  • 这种父子关系强制执行称为“引用完整性”的规则。

下面带有图示的 SQL 外键示例总结了关于外键的所有上述要点。

Rules for FOREIGN KEY in SQL
外键如何工作

如何在 SQL 中创建外键

我们可以在 SQL Server 中通过两种方式创建外键:

  1. SQL Server Management Studio
  2. T-SQL

SQL Server Management Studio

父表:假设我们有一个现有的名为“Course”的父表。Course_ID 和 Course_name 是两个列,其中 Course_Id 是主键。

Create FOREIGN KEY in SQL

子表:我们需要创建第二个表作为子表。包含“Course_ID”和“Course_Strength”两列。但是,“Course_ID”应为外键。

步骤 1) 右键单击“表”>“新建”>“表…”

Create FOREIGN KEY in SQL

步骤 2) 输入两列名称,分别为“Course_ID”和“Course_Strength”。右键单击“Course_Id”列。然后单击“关系”。

Create FOREIGN KEY in SQL

步骤 3)“外键关系”中,单击“添加”

Create FOREIGN KEY in SQL

步骤 4) 在“表和列规范”中,单击“...”图标

Create FOREIGN KEY in SQL

步骤 5) 从下拉列表中选择“主键表”为“COURSE”,将新创建的表选为“外键表”。

Create FOREIGN KEY in SQL

步骤 6) “主键表”– 选择“Course_Id”列作为“主键表”列。

“外键表”– 选择“Course_Id”列作为“外键表”列。单击“确定”。

Create FOREIGN KEY in SQL

步骤 7) 单击添加。

Create FOREIGN KEY in SQL

步骤 8) 将表名命名为“Course_Strength”并单击“确定”。

Create FOREIGN KEY in SQL

结果:我们在“Course”“Course_strength”之间建立了父子关系。

Create FOREIGN KEY in SQL

T-SQL:使用 T-SQL 创建父子表

父表:再考虑一下,我们有一个现有的父表,表名为“Course”。

Course_ID 和 Course_name 是两列,其中 Course_Id 是主键。

Create a Parent-child Table using T-SQL

子表:我们需要创建第二个表作为子表,名称为“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) 单击执行运行查询。

Foreign Key in SQL

结果:我们在“Course”“Course_strength_TSQL”之间建立了父子关系。

Foreign Key in SQL

使用 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;

Example Query FOREIGN KEY

现在,让我们向子表:“Course_strength_TSQL”插入一些行。

我们将尝试插入两种类型的行

  1. 第一种类型,其中子表中的 Course_Id 存在于父表的 Course_Id 中。即 Course_Id = 1 和 2
  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');

Example Query FOREIGN KEY

结果:让我们一起运行查询,看看我们的父表和子表。

Course_strength 表中存在 Course_ID 为 1 和 2 的行。而 Course_ID 5 是一个例外。

Example Query FOREIGN KEY

摘要

  • 外键的每个值都必须是其他表主键的一部分。
  • MySQL 外键可以引用同一表中的另一个列。这种引用称为自引用。
  • SQL 外键约束:用于保护表之间的链接,并防止无效数据插入外键列。
  • 您可以使用 Create Table、Alter Table 或 SQL Server Management Studio 创建外键。
  • 主键与外键的区别:点击这里