📜  参照完整性约束

📅  最后修改于: 2020-12-13 05:28:23             🧑  作者: Mango

参照完整性约束

参照完整性约束也称为外键约束。外键是其值从另一个表的主键派生的键。

派生值的表称为主表或引用表,而据此插入值的表称为子表或引用表,换句话说,可以说包含外键的表称为子表表,包含主键/候选键的表称为引用表或父表。当我们谈论数据库关系模型时,候选关键字可以定义为一组属性,可以具有零个或多个属性。

主表或引用表的语法为:

CREATE TABLE Student (Roll int PRIMARY KEY, Name varchar(25) , Course varchar(10) );

在这里,Roll列充当主键,这将有助于派生子表中外键的值。

子表或引用表的语法为:

CREATE TABLE Subject (Roll int references Student, SubCode int, SubName varchar(10) );

在上表中,Roll列用作外键,其值是使用主表中主键的Roll值得出的。

外键约束或引用完整性约束。

有两个参照完整性约束:

插入约束:如果值不在主表中,则不能将其插入到孩子表中

删除约束:如果值位于CHILD表中,则不能从MASTER表中删除该值

假设您想将Roll = 05与SUBJECT表中其他列的值一起插入,那么您将立即看到错误“违反外键约束”,即在运行插入命令时出现以下错误:

插入SUBJECT值(5,786,OS);由于插入约束,SQL将不会接受它(因为如果值不在主表中,则无法在子表中插入值,因为主表中不存在Roll = 5,因此不允许在子表中输入Roll = 5)

同样,如果您想从学生表中删除Roll = 4,那么您将立即看到错误“违反外键约束”,即在运行删除命令时显示为:

从Roll = 4的学生中删除;由于删除约束,SQL将无法接受。 (由于如果值位于子表中,则无法从主表中删除该值,因为子表中存在Roll = 5,因此不允许从主表中删除Roll = 5,我们设法以某种方式删除了Roll = 5,然后Roll = 5将在子表中可用,这最终违反了插入约束。

在删除级联上。

根据删除限制:如果值位于CHILD表中,则不能从MASTER表中删除该值。下一个问题是,如果值位于子表中而不违反删除约束,我们可以从主表中删除该值吗?即,当我们从主表中删除该值时,与其对应的值也将从子表中删除。

上面问题的答案是“是”,如果值位于子表中,而又不违反删除约束,我们可以从主表中删除该值,我们在创建子表时必须做一些修改,即通过添加删除级联

表格语法

CREATE TABLE Subject (Roll int references Student on delete cascade, SubCode int, SubName varchar(10) );

在以上语法中,在引用关键字(用于创建外键)之后,我们添加了删除级联,现在添加此类,可以在主表中删除该值(如果该值位于子表中而不违反删除)约束。现在,即使您在子表中位于Roll = 5的情况下,也要从主表中删除Roll = 5,这是有可能的,因为在您发出命令从主表中删除Roll = 5的那一刻,具有Roll =的行子表中的5也将被删除。


上面的两个表STUDENT和SUBJECT分别显示了四个值,现在假设您希望通过编写SQL命令从STUDENT(Master)表中删除Roll = 4;从STUDENT中删除,其中Roll = 4;

当SQL执行上述命令时,SUBJECT(Child)表中Roll = 4的行也将被删除,生成的STUDENT和SUBJECT表将如下所示:


从上面的两个表STUDENT和SUBJECT中,您可以看到在表Roll = 4中一次删除了一个表而没有违反删除约束。

有时在访谈中会问一个非常重要的问题:外键可以具有NULL值吗?

上一个问题的答案是“是”,它可能具有NULL值,而主键不能不计任何代价而为NULL。为了实际理解上述问题,下面让我们了解一下删除空值的概念。

ON DELETE NULL。

根据删除限制:如果值位于CHILD表中,则不能从MASTER表中删除该值。下一个问题是,如果值位于子表中而不违反删除约束,我们可以从主表中删除该值吗?即,当我们从主表中删除该值时,与其对应的值也应从子表中删除,或者可以用NULL值替换。

上面问题的答案是“是”,如果该值位于子表中,而没有违反删除约束,则可以通过在外键中插入NULL来从主表中删除该值,我们在创建子表时必须做一些修改,即通过添加delete null

表语法:

CREATE TABLE Subject (Roll int references Student on delete null, SubCode int, SubName varchar(10) );

在上述语法中,在引用关键字(用于创建外键)之后,我们在delete null上添加了内容,现在添加此类,可以在主表中删除该值(如果该值位于子表中而不违反删除)约束。现在,即使在子表中位于Roll = 4的情况下,如果您仍要从主表中删除Roll = 4,则可能是因为您发出命令从主表中删除Roll = 4时,具有Roll =的行子表中的4将被替换为NULL值。


上面的两个表STUDENT和SUBJECT分别显示了四个值,现在假设您希望通过编写SQL命令从STUDENT(Master)表中删除Roll = 4;从STUDENT中删除,其中Roll = 4;

当SQL执行上述命令时,SUBJECT(Child)表中Roll = 4的行将被替换为NULL值,生成的STUDENT和SUBJECT表将如下所示:


从上面的两个表STUDENT和SUBJECT中,您可以看到在表STUDENT中Roll = 4被删除,而在SUBJECT表中Roll = 4的值被替换为NULL。这证明外键可以具有空值。如果在SUBJECT表中,列Roll是与外键一起的主键,则在这种情况下,我们不能使外键具有NULL值。