猿问
下载APP

外键可以为NULL和/或重复吗?

请为我澄清两件事:

  1. 外键可以为NULL吗?

  2. 外键可以重复吗?

据我所知,NULL不应该在外键中使用,但在我的某些应用程序中,我能够NULL在Oracle和SQL Server中输入,我不知道为什么。


互换的青春
浏览 67回答 3
3回答

Qyouu

简答:是的,它可以是NULL或重复。我想解释为什么外键可能需要为null或者可能需要唯一或不唯一。首先要记住,外键只需要该字段中的值必须首先存在于另一个表(父表)中。根据定义,这就是FK。根据定义,空值不是值。Null意味着我们还不知道它的价值。让我给你一个真实的例子。假设您有一个存储销售提案的数据库。进一步假设每个提案仅分配了一个销售人员和一个客户。因此,您的提议表将有两个外键,一个具有客户端ID,另一个具有销售代表ID。但是,在创建记录时,并不总是分配销售代表(因为没有人可以自由处理它),因此填写了客户端ID,但销售代表ID可能为空。换句话说,当您在输入数据时可能不知道其值时,通常需要具有空FK的能力,但是您知道表中需要输入的其他值。要允许FK中的空值,通常您只需要在具有FK的字段上允许空值。null值与它是FK的想法是分开的。它是唯一的还是不唯一的,与表是否与父表具有一对一或一对多的关系有关。现在,如果你有一对一的关系,你有可能将数据全部放在一个表中,但如果表格太宽或者数据是在另一个主题上(员工 - 保险示例@tbone给出了)例如),那么你想要一个带有FK的单独表。然后你想要使这个FK也是PK(它保证唯一性)或对它施加一个独特的约束。大多数FK用于一对多的关系,这是你从FK获得的,而不在场上添加进一步的约束。所以你有一个订单表和订单详情表。如果客户一次订购十件商品,他有一个订单和十个订单明细记录,其中包含与FK相同的订单ID。

慕莱坞5435954

从马的嘴里:即使没有匹配的PRIMARY或UNIQUE键,外键也允许全部为NULL的键值对外键没有限制如果未在外键上定义其他约束,则子表中的任何行数都可以引用相同的父键值。此模型允许外键中的空值。...外键上的NOT NULL约束如果外键中不允许空值,则子表中的每一行都必须显式引用父键中的值,因为外键中不允许使用空值。子表中的任意数量的行都可以引用相同的父键值,因此该模型在父键和外键之间建立一对多关系。但是,子表中的每一行都必须引用父键值; 不允许在外键中缺少值(null)。可以使用上一节中的相同示例来说明这种关系。但是,在这种情况下,员工必须具有对特定部门的引用。对外键的唯一约束在外键上定义UNIQUE约束时,子表中只有一行可以引用给定的父键值。此模型允许外键中的空值。此模型在父键和外键之间建立一对一关系,允许外键中的未确定值(空值)。例如,假设employee表有一个名为MEMBERNO的列,指的是公司保险计划中的员工成员编号。此外,名为INSURANCE的表具有名为MEMBERNO的主键,该表的其他列保留与员工保险单相关的相应信息。employee表中的MEMBERNO必须是外键和唯一键:在EMP_TAB和INSURANCE表之间强制执行参照完整性规则(FOREIGN KEY约束)保证每个员工都有唯一的会员编号(UNIQUE键约束)外键上的UNIQUE和NOT NULL约束如果在外键上定义了UNIQUE和NOT NULL约束,则子表中只有一行可以引用给定的父键值,并且因为外键中不允许使用NULL值,所以子表中的每一行都必须显式引用父键中的值。

慕勒3428872

是的,外键可以为null,如上面高级程序员所说...我会添加另一个场景,其中外键需要为null ....假设我们在应用程序中有表评论,图片和视频,允许对图片和视频。在注释表中,我们可以有两个外键PicturesId,以及VideosId和主键CommentId。因此,当您对视频发表评论时,只需要VideosId并且pictureId将为null ...如果您对图片发表评论,则只需要PictureId,而且VideosId将为null ...
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答