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

什么是外键?
外键提供了一种在内部强制执行引用完整性的方法。 SQL服务器简单来说,外键确保一个表中的值必须存在于另一个表中。
FOREIGN KEY 规则
- SQL 外键允许包含 NULL 值。
- 被引用的表称为父表。
- 包含外键的表称为子表。
- 子表中的外键引用了 主键 在父表中。
- 这种亲子关系强化了被称为“参照完整性”的规则。
下图总结了以上关于外键的所有要点。
如何在 SQL 中创建外键
在 SQL Server 中,您可以通过两种方式创建外键:
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”,然后单击“确定”。
结果:我们已在“课程”和“课程强度”之间建立了父子关系。
T-SQL:使用 T-SQL 创建父子表
父表:假设我们有一个名为“Course”的现有父表。Course_ID 和 Course_name 是两列,其中 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”和“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;
现在让我们在子表“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 为 1 和 2 的行存在于 Course_Strength 表中。但是,Course_ID 为 5 的行是个例外,因为它在父表中没有匹配的行。

















