空SQL表是否有超级密钥?每个SQL表都有吗?

时间:2017-09-03 15:20:32

标签: mysql sql database relational-database unique-key

我知道SQL中的术语“SuperKey”代表什么,但我无法理解具体的东西,我想要一些帮助。

无数据的表格中,是否有超级密钥?

在任何表格中,总是是否存在?

3 个答案:

答案 0 :(得分:1)

TL; DR "超级键"是一个RM (Relational Model of Data)词。 SQL中没有标准用法。 SQL表的超级键可能被合理地非正式地称为可以声明primary keyunique not null的列集,加上可能{}当表最多占一行时(尽管你可以&#39) ; t声明它)。 "合理非正式地"因为SQL表不是RM关系。但是如果一个表没有重复的行并且没有空值,那么我们可以合理地说它是一个关系,并且像每个关系一样,它有一个或多个超级键。 基本关系关系表达式的超级键的定义考虑了它可以容纳的所有可能值,因此其当前值不会影响其超级键。根据超级键的定义,在空关系 value 中,每个属性子集都是超级键。

关系"超级键"

在数学中,一个意思是"关系"是一组类似行的"元组"这是价值清单。它代表一种关系(船舶)/关联。这就是" R" in" RM"来自,这是术语"关系数据库"来自。 (Codd 1970) (Date 2015)同样" ERM" (实体 - 关系模型)来自"关系"作为关系/关联。 (Chen 1976)在RM上下文中,"关系"也像桌子一样,但通常拥有一组"元组"这是一组"属性"姓名&值。 (或者它可能是数学关系或混合。)有两种RM感觉"超级键" - 关系值&关系变量或表达式。关系值的超级键是一组属性,其中关系不包含具有该子组的两行。关系变量或表达式的超级键是一组属性,在每种情况/状态中,它不包含具有该子元素的两行。因此,当一个变量可以容纳的所有值都具有该超级密钥时,它就具有某个超级密钥。

(在已发表的学术教科书中找到一个定义。请注意,当定义说"对于每个"或"对于所有"名称的值,它们意味着满足这样的条件时没有这样的价值。同样地,对于某些"&"存在(s)"参考命名值,他们并不意味着名称必须命名不同的值。)

空的碰巧将每个属性子集都作为超级键。包含变量变量表达式的超级键的定义考虑了它可以评估的所有可能值,因此其当前值不会影响其超级键的含义。

每个关系都有一个或多个超级键:一个关系包含一组元组,因此元组值最多出现一次,因此所有属性的子元素值最多出现一次,因此所有属性的集合都是超密钥。

SQL与关系

SQL表不是关系。这让人联想到数学与数学的混乱。属性关系允许重复和空值。所以SQL数据库被称为"关系"但他们很难体现RM。

由于SQL表与关系的相似性,涉及关系的术语被粗略地应用于表。但是,虽然你可以借用术语并赋予它们SQL的含义(值,表,超级键,CK,PK,FK,连接,谓词,NF,规范化等),但你不能仅仅用那些SQL意义来代替那些SQL意义。 RM定义,定理或算法中的单词,得到一些明智或真实的东西。此外,RM概念的SQL演示文稿几乎从未实际告诉您如何将RM概念合理地应用于SQL数据库。他们只是嘲笑RM演示文稿,不知道他们是否使用SQL术语来使术语变得荒谬或无效。 ("几乎"因为我希望有一些。)

如果你替换"关系"通过" table" (某些 RM超级密钥定义中的重复和/或空值)然后您将SQL超级密钥的定义作为满足primary key或{{{ 1}}约束。对于某些其他 RM超级键定义,当表最多包含一行时,您将获得这些设置加{}。 (因为它"标识"任何一行。)(你可能只会找到使用第二种语法的人但认为它定义了第一种语句的作用。而且他们不知道他们是通过误解术语来滥用定义。)有些人可能只是使用约束定义。你可能会发现" UK" (唯一密钥)用于三者中的任何一个。

当一个表既没有重复的行也没有空值时,我们可以将它解释为一个关系,行为元组和&列作为属性。然后我们可以合理地说表格的超级密钥是关系的超级密钥。

PS:" CK" 不要将超级密钥与CK(候选密钥)混淆。 CK是超级密钥,不包含任何较小的超级密钥。 (因此,CK是一个"最小"或"不可减少的"超级密钥。)一个关系可以有多个超级密钥&中正。 PK(主键)是选择为PK的一些CK。 SQL unique not null& primary key声明我们可以称之为SQL超级密钥,但不一定是最小的,我们称之为SQL CK。所以当你听到" PK"在SQL上下文中,您必须确定它是否意味着"(SQL超级键)列列表通过unique not null"和/或"区分SQL超级密钥(可能或可能不通过primary key声明)"和/或"区分SQL CK(最小SQL超级密钥)"。并且总是必须询问" key"手段。 (通常,SQL超级密钥,无论这意味着什么。)

PS:"关系(发货)" 直截了当地说出每个"关系" &安培; "关系" - 关联?表? FK(外键)?在RM数据库中的每个关系值(变量或表达式)represents a relation(ship)/association。但是"关系" (有时,"关系")也被(错误地)用于FK - 不是在RM或ERM中,而是在pseudo-RM & -ERM methods that misinterpret/misunderstand/misrepresent them中,其根源在它们之前。 (不幸的是,数据库行业的RM教育非常糟糕。)FKs,PKs,CKs,superkeys& other约束为not needed to query & update。 (他们是为了诚信。)

答案 1 :(得分:0)

超级键只是唯一标识记录的列或列组。例如员工表中的员工编号。

  1. 当该表为空(即尚未输入员工)时,表的键仍然是员工编号。密钥是表的属性,无论其中的记录如何。
  2. 有些情况下桌子没有超级钥匙。这种情况很少见。通常这些是列表,例如"员工在什么时间拨打哪个号码"。您可以存储员工编号,小时和电话号码。如果员工在同一小时内拨打相同的号码两次,则会有两个类似的记录,因此没有唯一的密钥。但是,大多数情况下都可以避免这种情况(在给出的示例中,我们可以将完整时间存储到几秒甚至几毫秒而不是几小时,从而得到一个由员工编号和通话时间组成的唯一密钥。)

答案 2 :(得分:0)

以下是 Ronald Fagin 1981 年 A Normal Form for Relational Databases that Is Based on Domains and Keys(定义域键范式的论文,D.K.N.F.)中的一些精确定义:

  • 属性:一组X。 例如。 {城市,国家}。
  • X-tuple:域的函数,属性集X。 例如。 {(city, Paris), (country, France)}。
  • X-relation:一组 X-元组。 例如。 {{(city, Paris), (country, France)}, {(city, Berlin), (country, Germany)}}。
  • X-constraint:域的函数,X-关系和codomain {0, 1} 的集合。对于将 X 关系 R 映射到 1 的 X-约束 σ,据说 R 服从 σ并且σ 保持R中。
  • 关系模式:第一个条目一组属性 X 和第二个条目一组 X 约束的元组。
  • 数据库模式:一组关系模式。
  • 关系模式实例:一个X关系,它具有关系模式的属性并遵守关系模式的约束。
  • 函数依赖 (FD) 约束AB 其中 A, B em> ⊆ XX-关系 R 中成立,使得对于所有 t1t2R 中,(t1[A] = t2[A] ⇒ t1[B] = t2[B]).
  • 键依赖 (KD) 约束:KEY(A) 其中 AX 中保持>X-关系 R 使得 AXR 中成立。 A 被称为关系模式(及其实例)的超级键(当它不可约时,也称为)具有键依赖约束 KEY(A).
<块引用>
  1. 空的 SQL 表总是有一个超级键吗?
  2. 每个 SQL 表总是有一个超级键吗?
  1. 是的,因为空的 X 关系服从任何键依赖约束 KEY(A) where AX

    证明。对于{}中的所有t1t2,(t1[A< /em>] = t2[A] ⇒ t1[X] = t2[X]),相当于对于所有 t1, t2, (t1, t2 在 {} ⇒ (t1[A] = t2[A] ⇒ t1[X] = t2[X])),这是一个 vacuous truth 作为前因 <第一个条件的 {} 中的 em>t1t2 为假。

  2. 是的,因为每个 X 关系都遵循键依赖约束 KEY(X)。

    证明。R 成为 X 关系。对于R中的所有t1t2,(t1[X] = < em>t2[X] ⇒ t1[X] = t2[X ])。