数据库
首页 > 数据库> > mysql – 一个空的SQL表是否有超级密钥?每个SQL表都有吗?

mysql – 一个空的SQL表是否有超级密钥?每个SQL表都有吗?

作者:互联网

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

在没有数据的表中,有超级密钥吗?

在任何表中,总会存在一个吗?

解决方法:

TL; DR“超级密钥”是一个RM (Relational Model of Data)术语. SQL中没有标准用法. SQL表的超级键可能被合理地非正式地称为可以声明主键或唯一非空的列集,加上可能{}当表最多保存一行时(尽管您不能声明它). “合理非正式地”,因为SQL表不是RM关系.但是如果一个表没有重复的行并且没有空值,那么我们可以合理地说它是一个关系,并且像每个关系一样,它有一个或多个超级键.基本关系或关系表达式的超级键的定义考虑了它可以容纳的所有可能的值,因此其当前值不会影响其超级键.根据超级键的定义,在空关系值中,每个属性子集都是超级键.

关系“超级钥匙”

在数学中,“关系”的一个含义是一组类似于行的“元组”,它们是值列表.它代表一种关系(船舶)/关联.这就是“RM”中的“R”来自哪里,这就是术语“关系数据库”的来源. (Codd 1970) (Date 2015)类似地,“ERM”(实体 – 关系模型)来自“关系”作为关系/关联. (Chen 1976)在RM上下文中,“关系”也是表格式的,但通常包含一组“元组”,这些“元组”是“属性”名称对的集合.值. (或者它可能是数学关系或混合.)有两种RM感官的“超级钥匙” – 关系价值&关系变量或表达式.关系值的超级键是一组属性,其中关系不包含具有该子组的两行.关系变量或表达式的超级键是一组属性,在每种情况/状态中,它不包含具有该子元素的两行.因此,当一个变量所拥有的所有值都具有该超级密钥时,它就具有某个超级密钥.

(在已发表的学术教科书中找到一个定义.请注意,当定义为名称表示“for every”或“for all”时,它们意味着在没有这样的值时满足这样的条件.类似地,当“for some”& ;“存在(s)”是指命名值,它们并不意味着名称必须命名不同的值.)

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

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

SQL与关系

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

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

如果在某些RM超级键定义中将“relation”替换为“table”(允许重复和/或空值),那么您将获得SQL超级键的定义,作为满足主键或唯一非空约束的列集.对于某些其他RM超级键定义,当表最多包含一行时,您可以获得这些集加{}. (因为它“识别”任何一行.)(你可能只会找到使用第二种语法的人,但认为它定义了第一种语句的作用.他们不会因为误解术语而误解定义.有些人可能只使用约束定义.您可能会发现三者中任何一个都使用“UK”(唯一键).

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

PS:“CK”不要将超级密钥与CK(候选键)混淆. CK是超级密钥,不包含任何较小的超级密钥. (因此,CK是一个“最小”或“不可简化”的超级密钥.)一个关系可以有多个超级密钥&中正. PK(主键)是选择为PK的一些CK. SQL主键& unique not null声明我们可以称之为SQL超级密钥,但不一定是最小的,我们称之为SQL CK.因此,当您在SQL上下文中听到“PK”时,您必须确定它是否意味着“(SQL超级密钥)列列表通过主键声明”和/或“区分SQL超级密钥(可能或可能不通过主键声明)”和/或“distinguished SQL CK(minimal SQL superkey)”.你总是要问“关键”是什么意思. (通常,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.(它们是为了完整性.)

标签:sql,mysql,database,relational-database,unique-key
来源: https://codeday.me/bug/20190927/1824775.html