复合主索引和两个主索引之间有什么区别?

时间:2017-07-25 00:13:29

标签: mysql

我正在使用phpmyadmin并且发现您只能拥有一个PRIMARY键/索引(如果它们在该上下文中可以互换),但它可以包含多个列。

如果你有这样的话,为什么它不允许创建多个PRIMARY密钥/索引?

2 个答案:

答案 0 :(得分:0)

主键有三个属性:

  • 键不为空。
  • 键是唯一的(组合)。
  • 桌子上只有一个。

此外,MySQL使用主键来对表进行聚类 - 这些行实际上是按排序顺序存储的。并非所有数据库都这样做。

最后一个条件 - 集群 - 几乎可以解释为什么表中只能有一个主键。但是,前两个条件可以使用validates :comment, presence: { unless: :points.blank?, on: :create } validates :points, presence: { unless: :comment?, on: :create }, numericality: { only_integer: true, allow_nil: true, less_than_or_equal_to: 10, greater_than_or_equal_to: 0 } unique约束来实现其他列。

主键可以是复合键,即由多个键组成。你会将其声明为:

not null

答案 1 :(得分:0)

  

表只能有一个PRIMARY键/索引[...],但它可以包含多个列。

这是正确的。

  

如果你有这样的话,为什么它不允许创建多个PRIMARY键/索引?

主键的作用是充当表中给定行的唯一标识符。如果您执行搜索尝试匹配PK,如果匹配则获得1个结果,如果不存在此类PK,则获得0。

OTOH,列只表示描述存储在单行中的对象的属性。如果您有一个Person表,那么您可以使用以下内容:

------
Person
------
id: int, pk, autoincrement
name: varchar
dob: datetime

其中idnamedob是描述存储在一行中的任何给定Person的列,其中id唯一标识其中的每一个。

  

但是,这是如何解释复合主键和两个独立主键之间的区别?

每张桌子只能有一张PK。但是,您可以组合多个列以在有用的情况下创建复合PK。通常,当组合多个列时,这些列可以在关联表中找到,并映射到映射到其他独立表中的主键(PK)的外键(FK)。

复合键倾向于在关联表中使用,关联表用于表达M:M关系。

在单个关联表中组合来自其他几个表的PK,可以唯一地标识特定匹配。

例如,考虑一家杂货店。人与商店之间存在M:M关系,b / c每个商店都可以有很多人购买,人们可以访问他们喜欢的任何商店。

假设您的所有商店都有一个中央数据库,并且您想要跟踪订单。我们可以这样:

+--------+
| Person |
+--------+
id: int, pk, autoincrement
name: varchar

+-------+
| Store |
+-------+
id: int, pk, autoincrement
name: varchar
address: varchar

+-------+
| Order |
+-------+
person_id: int, fk to Person.id
store_id: int, fk to Store.id
date_placed: datetime
...

Order表格中,person_idstore_iddate_placed列可以合并为一个复合 PK,以便我们可以唯一标识每个订单。

它们被视为PK的事实意味着您不能为任何给定组合提供多个匹配行,因此它有助于引用完整性约束:如果有任何尝试使用重复信息插入新行,则数据库由于PK约束违规而拒绝该尝试,这可以保证PK是唯一的。

还有其他好处,但这是复合PK非常有用的一种方式。