我正在使用phpmyadmin并且发现您只能拥有一个PRIMARY
键/索引(如果它们在该上下文中可以互换),但它可以包含多个列。
如果你有这样的话,为什么它不允许创建多个PRIMARY
密钥/索引?
答案 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
其中id
,name
和dob
是描述存储在一行中的任何给定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_id
,store_id
和date_placed
列可以合并为一个复合 PK,以便我们可以唯一标识每个订单。
它们被视为PK的事实意味着您不能为任何给定组合提供多个匹配行,因此它有助于引用完整性约束:如果有任何尝试使用重复信息插入新行,则数据库由于PK约束违规而拒绝该尝试,这可以保证PK是唯一的。
还有其他好处,但这是复合PK非常有用的一种方式。