DBMS 中的参照完整性约束17 Mar 2025 | 6 分钟阅读 参照完整性约束也称为外键约束。外键是其值来自另一张表的主键的值的键。 从中派生值的表称为主表或被引用表,而从中插入值的表称为子表或引用表。换句话说,我们可以说包含外键的表称为子表,包含主键/候选键的表称为被引用表或父表。当我们谈论数据库关系模型时,候选键可以定义为一组可以具有零个或多个属性的属性。 主表或被引用表的语法是 在此,Roll 列充当主键,这将有助于派生子表中的外键值。 ![]() 子表或引用表的语法是 ![]() 在上面的表中,Roll 列充当外键,其值是通过主表中的 Roll 值派生出来的。 外键约束或参照完整性约束。有两种参照完整性约束 插入约束:如果值不在主表中,则无法在子表中插入值 删除约束:如果值在子表中,则无法从主表中删除值 假设您想在 SUBJECT 表中插入 Roll = 05 及其他列的值,您将立即看到一个错误“外键约束违反”,即在运行插入命令时 Insert into SUBJECT values(5, 786, OS); SQL 不会处理,因为它违反了插入约束(因为如果值不在主表中,您不能在子表中插入值,由于主表中不存在 Roll = 5,因此不允许在子表中输入 Roll = 5。) 同样,如果您想从 STUDENT 表中删除 Roll = 4,您将立即看到一个错误“外键约束违反”,即在运行删除命令时 Delete from STUDENT where Roll = 4; SQL 不会处理,因为它违反了删除约束。(因为如果值在子表中,您不能从主表中删除值,由于子表中存在 Roll = 5,因此不允许从主表中删除 Roll = 5。如果我们设法删除了 Roll = 5,那么 Roll = 5 将存在于子表中,这最终会违反插入约束。) ON DELETE CASCADE(删除时级联)。 根据删除约束:如果值在子表中,则无法从主表中删除该值。接下来是问题:我们能否在不违反删除约束的情况下从主表中删除位于子表中的值?也就是说,一旦我们从主表中删除了该值,位于子表中的相应值也应该被删除。 以上问题的答案是肯定的,我们可以从主表中删除位于子表中的值,而不会违反删除约束。我们只需要在创建子表时进行一些修改,即添加on delete cascade。 表语法 在上面的语法中,就在 references 关键字(用于创建外键)之后,我们添加了 on delete cascade。通过添加此项,我们可以在不违反删除约束的情况下从主表中删除位于子表中的值。现在,如果您想从主表中删除 Roll = 5,即使 Roll = 5 存在于子表中,也是可能的,因为您发出从主表中删除 Roll = 5 的命令后,子表中具有 Roll = 5 的行也将被删除。 ![]() ![]() 上面显示了具有四个值的 STUDENT 和 SUBJECT 两张表。现在,假设您想通过编写 SQL 命令从 STUDENT(主表)中删除 Roll = 4:delete from STUDENT where Roll = 4; SQL 执行上述命令后,SUBJECT(子表)中具有 Roll = 4 的行也将被删除。生成的 **STUDENT 和 SUBJECT** 表将如下所示: ![]() ![]() 从上面的 STUDENT 和 SUBJECT 两张表中,您可以看到在两张表中,Roll = 4 都被一次性删除了,而没有违反删除约束。 有时在面试中会问一个非常重要的问题:外键可以有 NULL 值吗? 以上问题的答案是肯定的,它可以有 NULL 值,而主键无论如何都不能为空。为了实际理解以上问题,让我们先来理解删除 NULL 的概念。 ON DELETE NULL(删除时置 NULL)。 根据删除约束:如果值在子表中,则无法从主表中删除该值。接下来是问题:我们能否在不违反删除约束的情况下从主表中删除位于子表中的值?也就是说,一旦我们从主表中删除了该值,位于子表中的相应值也应该被删除,或者可以替换为 NULL 值。 以上问题的答案是肯定的,我们可以在不违反删除约束的情况下从主表中删除位于子表中的值,方法是在外键中插入 NULL。我们必须在创建子表时进行一些修改,即添加on delete null。 表语法 在上面的语法中,就在 references 关键字(用于创建外键)之后,我们添加了 on delete null。通过添加此项,我们可以在不违反删除约束的情况下从主表中删除位于子表中的值。现在,如果您想从主表中删除 Roll = 4,即使 Roll = 4 存在于子表中,也是可能的,因为您发出从主表中删除 Roll = 4 的命令后,子表中具有 Roll = 4 的行将被 NULL 值替换。 ![]() ![]() 上面显示了具有四个值的 STUDENT 和 SUBJECT 两张表。现在,假设您想通过编写 SQL 命令从 STUDENT(主表)中删除 Roll = 4:delete from STUDENT where Roll = 4; SQL 执行上述命令后,SUBJECT(子表)中具有 Roll = 4 的行将被 NULL 值替换。生成的 **STUDENT 和 SUBJECT** 表将如下所示: ![]() ![]() 从上面的 STUDENT 和 SUBJECT 两张表中,您可以看到在 STUDENT 表中 Roll = 4 被删除了,而在 SUBJECT 表中 Roll = 4 的值被替换为 NULL。这证明了外键可以有 NULL 值。如果 SUBJECT 表中的 Roll 列同时是主键和外键,那么在这种情况下,我们就不能让外键具有 NULL 值。 下一主题关于有损和无损分解的问题 |
我们请求您订阅我们的新闻通讯以获取最新更新。