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

⚡ 智能摘要

在 SQL Server 中,外键通过将子表链接到父表来强制执行引用完整性。每个外键值都必须已存在于被引用的父表的主键中。

  • 🔗 什么是外键: 外键将子表与父表连接起来,并强制执行它们之间的引用完整性。
  • 👪 父母和孩子: 被引用的表是父表;包含外键的表是子表,它指向父表的主键。
  • 🖱️ 两种创作方法: SQL Server Management Studio 关系和 T-SQL CREATE TABLE … FOREIGN KEY … REFERENCES 子句都定义了外键。
  • 添加到现有表格: ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY 将关系添加到已存在的表中。
  • 🔄 参照行为: ON DELETE 和 ON UPDATE 子句控制子行,包括 NO ACTION、CASCADE、SET NULL 或 SET DEFAULT。
  • Integrity 检查: 插入一个子行时,如果该子行的键没有匹配的父行,则会被拒绝。ping 数据一致。

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

什么是外键?

外键提供了一种在内部强制执行引用完整性的方法。 SQL服务器简单来说,外键确保一个表中的值必须存在于另一个表中。

FOREIGN KEY 规则

  • SQL 外键允许包含 NULL 值。
  • 被引用的表称为父表。
  • 包含外键的表称为子表。
  • 子表中的外键引用了 主键 在父表中。
  • 这种亲子关系强化了被称为“参照完整性”的规则。

下图总结了以上关于外键的所有要点。

外键示意图,用于将子表连接到父表的主键

如何在 SQL 中创建外键

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

SQL Server Management Studio中

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

父表 Course,包含 Course_Id 主键和 Course_name 列

子表:我们需要创建第二个表作为子表。该表包含两列:'Course_ID' 和 'Course_Strength'。其中,'Course_ID' 将是外键。

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

在 SQL Server Management Studio 中,右键单击“表”,然后选择“新建”,再选择“表”。

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

在“关系”菜单中新增子表列 Course_ID 和 Course_Strength

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

带有“添加”按钮的“外键关系”对话框

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

带有省略号按钮的“表格和列规范”字段

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

在关系对话框中选择 COURSE 作为主键表

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

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

地图ping Course_Id 同时作为主键和外键列

步骤 7)点击“添加”。

点击“添加”以确认外键关系

步骤 8)将表名设为“Course_Strength”,然后单击“确定”。

将子表命名为 Course_Strength,然后单击“确定”。

结果:我们已在“课程”和“课程强度”之间建立了父子关系。

Course 和 Course_Strength 之间建立了亲子关系

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

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

现有父表 Course,其中 Course_Id 为主键

子表:我们需要创建第二个表作为子表,名称为“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 中主键的子表列。
  • parentTable 是父表的名称,子表引用该父表的键。
  • parent_column1、parent_column2 … parent_column_n 是构成父表主键的列。
  • ON DELETE 是一个可选参数,用于指定删除父数据后子数据的处理方式。其值包括 NO ACTION、SET NULL、CASCADE 或 SET DEFAULT。
  • ON UPDATE 是一个可选参数,用于指定父数据更新后子数据的处理方式。其值包括 NO ACTION、SET NULL、CASCADE 或 SET DEFAULT。
  • “不采取任何行动”意味着在父数据更新或删除后,子数据不会发生任何变化。
  • CASCADE 表示父数据被删除或更新后,子数据也被删除或更新。
  • SET NULL 表示在父数据更新或删除后,子数据被设置为 null。
  • SET DEFAULT 表示在父数据更新或删除后,子数据将被设置为其默认值。

让我们来看一个外键示例,该示例创建一个表,其中一列作为外键。 数据类型 每列。

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_ID 外键的 CREATE TABLE 查询

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

在 Course 和 Course_Strength_TSQL 之间创建了父子关系

使用 ALTER TABLE

现在我们将学习如何使用 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 中主键的子表列。
  • parentTable 是父表的名称,子表引用该父表的键。
  • parent_column1、parent_column2 … parent_column_n 是构成父表主键的列。

ALTER TABLE 添加外键示例:

ALTER TABLE department
ADD CONSTRAINT fkey_student_admission
    FOREIGN KEY (admission)
    REFERENCES students (admission);

我们在部门表上创建了一个名为 fkey_student_admission 的外键。此外键引用学生表的入学列。

示例查询 FOREIGN KEY

首先,让我们看一下父表数据,COURSE。

查询:

SELECT * from COURSE;

SELECT 结果显示父表 COURSE 数据

现在让我们在子表“Course_Strength_TSQL”中插入一些行。我们将尝试插入两种类型的行:

  • 第一种类型,子表中的 Course_Id 存在于父表中的 Course_Id 中,即 Course_Id = 1 和 2。
  • 第二种类型,子表中的 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_ID 5

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

Course_ID 为 1 和 2 的行存在于 Course_Strength 表中。但是,Course_ID 为 5 的行是个例外,因为它在父表中没有匹配的行。

比较父表和子表;Course_ID 5 违反了引用完整性

常见问题

主键唯一标识其所在表中的每一行,且不能为空。外键从另一个表引用该主键,以确保引用完整性。 主键与外键 比较可以解释所有区别。

是的。外键可以引用主键,也可以引用父表中任何带有唯一约束的列。被引用的列必须包含唯一值,以确保每个子行都与父表中的某一行完全匹配。

ON DELETE CASCADE 会在父行被删除时自动删除匹配的子行,保留ping 表结构一致。其他方法包括使用 SET NULL(清除子外键)和 NO ACTION(阻止删除操作)。

是的。自引用外键指向同一张表中的主键,用于模拟层级结构,例如员工行引用其经理。对于自引用,SQL Server 建议使用 ON DELETE NO ACTION 语句,以避免循环删除。

是的,除非该列声明为 NOT NULL。NULL 外键表示子行尚未链接到任何父行,SQL Server 会跳过对该 NULL 值的引用检查。

运行 ALTER TABLE child_table DROP CONSTRAINT fkey_name。您必须提供约束名称,该名称可在 sys.foreign_keys 中找到。删除ping 外键会移除表与表之间的关系,但不会改变两个表及其数据。

是的。 GitHub 副驾驶 可以通过自然语言提示,在 CREATE TABLE 或 ALTER TABLE 语句中编写外键约束,并建议父表和被引用的列。运行脚本前,务必检查键、引用操作和数据类型。

人工智能和机器学习工具会检查样本数据和查询模式,以建议哪些列应该成为外键,检测缺失或孤立的关系,并推荐合适的删除操作。开发人员会在应用每项建议之前进行审核。

总结一下这篇文章: