繁体   English   中英

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

[英]How Primary key can be only one in a table

经过大量搜索之后,我发现了2条关于主键的语句。

有人说,主键只能是表中的一个。

有人说,主键可以包含多个列。

并且还说,这是主键和唯一键之间的区别。

我读了这篇文章: 主键和唯一键之间的区别

但是,这篇文章也混淆了这种差异。

我的问题是:

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?

优化程序使用主键在该键周围创建聚簇索引。 如果该键碰巧是列的组合(例如,在处理多对多关系的表中),那很好。 唯一键是某事物的唯一属性,而不是您要用作主键的属性。

我工作的一个例子是汽车。 VIN是汽车特有的。 但是,由于在车辆寿命的不同阶段使用了车辆号和车身号。 虽然它是汽车特有的,但它并不是很好的主键候选。 因此,我们有每辆车唯一的标识符作为主键。

同样,我们使用多列上的主键来处理用户组表。 因此,userid和usergroupid的组合是一个主键,可以防止人们多次进入同一组。 这里使用主键而不是唯一键主要是为了符合第三范式。

希望对您有所帮助,但如果您想进一步澄清,请告诉我。

一个表中只能有一个主键,但是它可以由多个列组成。 这并不意味着每一列都是主键,而是所有这些列的值的组合都是唯一的。

唯一约束与防止重复值的主要约束类似,但是唯一约束允许null (因为它们不是值)。 主键则没有。 您可以将主键视为唯一的非null约束。

在SQL中:一个或多个列的任意数量的集合都可以声明为UNIQUE。 可以将一组列声明为PK(PRIMARY KEY)。 PK表示UNIQUE NOT NULL。 一组单列是“简单的”,一组以上是“复合的”。

在标准SQL中,UNIQUE列集在每行中都有一个不同的子行值-其中NULL <> NULL。 MySQL做到了-但是某些DBMS评估该“区别”对待NULL等于NULL。 阅读手册。

SQL DBMS将UNIQUE和PK声明用于其他用途-通常用于默认INDEX。 INDEX不是标准的SQL,而是另一种概念。 阅读手册。

PK和其他术语在RM(关系模型)中具有不同的定义-即使对于表具有明显解释为关系的表,因为它们没有重复的行且没有NULL。 阅读一些出版的学术教科书。

不需要SQL或RM中的PK,这只是一个传统。

SQL和RM中的相关术语。

主键可以包含任意数量的列。 然后,它们具有三个属性:

  • 列中值的组合是唯一的。
  • 每列中的值永远不会为NULL
  • 每个表只有一个主键。

前两个条件在表中的任何数量的列或列组合上都可以成立。 这些称为候选主键。 您将使用unique not null约束来实现它们。

第三个条件只是简单地说,这些候选者中最多可以选择一个作为键。

考虑这一点的一种方法是主键是特殊的。 例如,在MySQL中,数据实际上是通过主键在数据页上排序的(这称为聚簇索引 )。 但是,在SQL中,通常没有什么要求主键也必须是聚集索引,并且并非所有数据库都可以实现此目的。

您阅读的内容没有矛盾之处

主键是“一列或多列,其值的组合必须仅出现在一行上”

主键可以是单列,然后值必须是唯一的。 它可以是多列,并且所有值一起考虑必须是唯一的:

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

在这里,key1列和key2列都具有重复的值是正确的,但是当我们考虑键1和键2的组合时,它们是唯一的:1A,1B,2A,2B

关于PK与唯一键查询,请参见此答案。 它更详细地介绍了主键,其基本原理是组成主键的所有列都不允许使用空值: 复合主键中的可空列怎么了?

主键和唯一键之间的主要区别是主键主要工作是唯一地标识表中的行,唯一键的主要工作是允许您在列上放置其他唯一条件

例如,假设您有一个employee表,其中employee ID为主键和一个accountNumber .. accountNumber将被设置为唯一ID ...,因此如果accountNumber是由生成的,则不会将accountNumber设置为主键数据库之外的另一个组织。

当主键可以由多个列组成时,一个表如何只能为1,那么除了唯一值与空值差异之外,它又如何与唯一键有所不同?

的确,一个表只能有一个主键。 该键可以包含多个列(列的组合)。 列的组合是集体的,是主键。

让我们举个例子

表A

ID,客户ID,分支ID,名称,地址...

在这里,我创建了一个主键,其中包含“ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM