主键如何只能是表中的一个

5lhxktic  于 2021-06-18  发布在  Mysql
关注(0)|答案(7)|浏览(415)

在google了很多次之后,我找到了两个主键语句。
有人说,主键只能是表中的一个。
有人说,主键可以由多个列组成。
也就是说,它是主键和唯一键的区别。
我读过这篇文章:主键和唯一键的区别
但是,这篇文章也混淆了这种差异。
我的问题是:

When Primary key can consists of multiple columns, then how can it be only 
1 for a table and then  how this can differ from Unique Key except from   
null value difference?
vlurs2pr

vlurs2pr1#

当主键可以由多列组成时,那么对于一个表,它如何只能是1,以及除了空值差异之外,它如何与唯一键不同?
确实,一个表只能有一个主键。此键可以包含多列(列的组合)。列的组合是一个主键。
举个例子
表a
id,clientid,branchid,姓名,地址。。。。。。。
在这里,我创建了一个组合为“id,clientid,branchid”的主键
因此,可以有重复的id、重复的clientid或重复的branchid,但不可能有整个组合作为重复
例如

Id    Clientid    Branchid  
1        1           1  
1        2           1  
1        1           2  
2        1           1

上面的组合是真的,但是下面的组合不允许作为主键,并且不能有重复的值

Id    Clientid    Branchid  
 1        1           1  
 1        1           1

所有列都为null也是不可能的,因为主键不允许null

a5g8bdjr

a5g8bdjr2#

一个表中只能有一个主键,但它可以由多列组成。这并不意味着每一列都是主键,而是所有这些列的值的组合都是唯一的。
唯一约束在防止值重复方面与主约束类似,但唯一约束允许 null s(因为它们不是值)。主键不存在。您可以将主键视为唯一的非空约束。

8wigbo56

8wigbo563#

在sql中:一个或多个列的任意数量的集合都可以声明为唯一的。一组列可以声明为pk(主键)。pk表示唯一不为空。一个列的集合是“简单的”,多个列的集合是“复合的”。
在标准sql中,一个唯一的列集在每一行中都有一个不同的子程序值——其中null<>null。mysql做到了这一点——但有些DBMS会计算“distinct”值,将null视为等于null。阅读手册。
sqldbms对其他事情使用unique&pk声明——通常用于默认索引。索引不是标准的sql&是另一个概念。阅读手册。
pk和其他术语在rm(relational model)中有不同的定义——甚至对于那些有明显的关系解释的表,因为它们没有重复的行和空值。阅读一些已出版的学术教科书。
在sql或rm中不需要pk——这只是一个传统。
sql和rm中的相关术语。

oprakyz7

oprakyz74#

你所读的内容没有前后矛盾之处
主键是“一个或多个列,其值的组合只能出现在一行上”
主键可以是单列,然后值必须是唯一的。它可以是多列,并且所有值必须是唯一的:

Key1, Key2
1   , A
1   , B
2   , A
2   , B

在这里,key1列和key2列确实都有重复的值,但是当我们考虑键1和键2的组合时,它们是唯一的:1a、1b、2a、2b
关于pk vs unique key查询,请参见以下答案。它更详细地介绍了主键,其基本原理是组成主键的列都不允许空值:复合主键中的可空列有什么问题?

5rgfhyps

5rgfhyps5#

主键和唯一键之间的主要区别是主键主键的主要任务是唯一地标识表中的行,唯一键的主要任务是允许您在列上放置其他唯一条件
例如,假设您有一个employees表,employeeid作为主键,accountnumber。。accountnumber将被设置为唯一id。。。因此,如果accountnumber是由数据库之外的另一个组织生成的,则不会将accountnumber设置为主键。。

von4xj4u

von4xj4u6#

主键可以由任意数量的列组成。它们有三个属性:
列中的值组合是唯一的。
每列中的值永远不会 NULL .
每个表只有一个主键。
前两个条件可以在表中任意数量的列或列的组合上为真。这些被称为候选主键。你可以用 unique 以及 not null 约束条件。
第三个条件是,最多只能选择其中一个候选者作为主键。
考虑这一点的一种方法是主键是特殊的。例如,在mysql中,数据实际上是按主键在数据页上排序的(这称为聚集索引)。然而,一般来说,sql中没有任何东西要求主键也是聚集索引,而且并非所有数据库都实现了这一点。

qhhrdooz

qhhrdooz7#

Optimizer使用主键来围绕该键创建聚集索引。如果该键恰好是列的组合(例如在处理多对多关系的表中),那么就可以了。唯一键是某事物的一个属性,它对该事物是唯一的,但不是要用作主键的属性。
我工作的一个例子就是汽车。车辆识别号是该车独有的。但是,由于vin和车身号在车辆寿命的不同阶段使用。虽然它是独特的汽车,它不是一个好的主要关键候选人。所以每辆车都有一个唯一的标识符作为主键。
类似地,我们处理在多列上具有主键的用户组表。因此,userid和usergroupid的组合是防止同一组中的人多次进入的主键。这里使用主键而不是唯一键主要是为了符合第三范式。
我希望这有帮助,但如果你想进一步澄清,请让我知道。

相关问题