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

时间:2018-11-03 09:07:30

标签: mysql sql database-design primary-key

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

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

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

也说,这是主键和唯一键之间的区别。

我读了这篇文章:difference between primary key and unique key

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

我的问题是:

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?

7 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在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,这只是一种传统。

Re related terms in SQL & the RM.

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:0)

阅读内容没有矛盾

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

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

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

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

关于PK与唯一键查询,请参见此答案。它更详细地介绍了主键,其基本原理是组成主键的所有列都不允许使用空值:What's wrong with nullable columns in composite primary keys?

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

  

当主键可以由多列组成时,怎么可能   一个表只有1个,然后它与唯一键有何不同   除了零值差之外?

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

让我们举个例子

表A

  

Id,Clientid,Branchid,名称,地址,.......

在这里,我创建了一个包含“ Id,Clientid,Branchid”的主键

因此可能有重复的ID或重复的CLientid或重复的Branchid,但不可能将整个组合作为重复的

例如

window.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
};

以上组合为真 但以下组合不能用作主键,并且不能有重复的值

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

并且所有列都不能为空,因为主键不允许为空