在关系模型中,保证在表中存在且唯一的任何列或列集都可以称为表的候选键。“现在”的意思是“不为空”。数据库设计中的常见做法是将其中一个候选键指定为主键,并使用对主键的引用来引用整行或行描述的主题项。
在 SQL 中,PRIMARY KEY 约束相当于每个主键列的 NOT NULL 约束,以及所有主键列的 UNIQUE 约束。在实践中,许多主键变成了单列。
对于大多数 DBMS 产品,PRIMARY KEY 约束也会导致在主键列上自动构建索引。当为主键创建新条目时,这会加快系统检查活动,以确保新值不会与现有值重复。它还加快了基于主键值的查找速度,并在主键和引用它的外键之间进行连接。加速多少取决于查询优化器的工作方式。
最初,关系数据库设计人员在数据中寻找给定的自然键。近年来,趋势一直是总是创建一个称为 ID 的列,一个整数作为第一列和每个表的主键。DBMS 的自动生成功能用于确保此密钥是唯一的。这种趋势记录在“奥斯陆设计标准”中。它不一定是关系设计,但它服务于遵循它的人的一些直接需求。我不推荐这种做法,但我承认这是流行的做法。
索引是一种数据结构,它允许根据对被索引的表的列的描述快速访问表中的几行。索引由某些表列的副本组成,称为索引键,散布着指向表行的指针。指针通常对 DBMS 用户隐藏。索引与查询优化器协同工作。用户在 SQL 中指定正在寻找的数据,优化器提出索引策略和其他策略,用于将正在寻找的内容转换为找到它的策略。有某种组织原则,例如排序或散列,使索引能够用于快速查找和某些其他用途。一旦数据库构建器创建了索引或声明了主键,这一切都是 DBMS 内部的。
可以建立与主键无关的索引。主键可以在没有索引的情况下存在,尽管这通常是一个非常糟糕的主意。