大量搜索之后,我发现了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?
答案 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,这只是一种传统。
答案 3 :(得分:1)
主键可以包含任意数量的列。然后,它们具有三个属性:
NULL
。在表中的任意数量的列或列组合上,前两个条件可以为true。这些称为候选主键。您将使用unique
和not 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
并且所有列都不能为空,因为主键不允许为空