【问题标题】:Subset of a candidate key候选键的子集
【发布时间】:2014-07-28 07:15:26
【问题描述】:

我们知道候选键是唯一标识关系中的行的列或列组合。

假设我有一个关系,其中候选键是列的组合。我想问一下,

候选键的子集是否也可以唯一标识行?

候选键是没有唯一标识行的子集的键吗?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于关系数据库理论,而不是实际编程。 cs.stackexchange.com 可能是一个更好的询问地点。
  • 为什么要关闭这个问题。在这个论坛上提出了与此问题相关的问题,例如 stackoverflow.com/questions/8337309/superkey-candidate-key-primary-key。
  • 那是几年前的事了,从那时起规则就收紧了。
  • @Barmar 写DBMS软件是必须的,直接适用,你的“不实用编程”是错误的。
  • 这听起来更像是数据库课上的家庭作业问题,而不是实际的编程问题。

标签: sql relational-database candidate-key


【解决方案1】:

候选键是一列或多列的组合。或者更准确地说是一组一个或多个列。或者更准确地说是一组列。

候选键是一组唯一标识行的列,并且不包含唯一标识行的较小(“适当”)列子集。

超级键是一组唯一标识行的列。所以候选键是一个不包含更小的超键的超键。

在 SQL 中,您不能声明一个空的候选键。此外,UNIQUE NOT NULL 和 PRIMARY KEY(就约束而言仅表示 UNIQUE NOT NULL)声明超级键,而不是键本身。如果此类声明的列集不包含声明为超键的较小列集,则它声明的超键是候选键。

您的问题最初是说您有一个关系,其中候选键是“键的组合”。也许您的意思是,超级键(列)的一些较小子集是超级键或候选键。

所以不,候选键不能包含较小的候选键。另一方面,在 SQL 中,您可以在另一个 UNIQUE/PK 声明的列的较小子集上使用 UNIQUE/PK 声明。但是后者不会是候选键。

【讨论】:

    【解决方案2】:

    根据定义,候选键的任何真子集都不能识别行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多