【发布时间】:2011-03-21 07:31:20
【问题描述】:
谁能告诉我主键和索引键有什么区别。什么时候用哪个?
【问题讨论】:
标签: database primary-key
谁能告诉我主键和索引键有什么区别。什么时候用哪个?
【问题讨论】:
标签: database primary-key
主键是一种特殊的索引:
您倾向于将主键用作一行最自然的唯一标识符(例如社会保险号、员工 ID 等,尽管有一种观点认为您应该始终为此使用人工代理键)。
另一方面,索引可用于基于其他列的快速检索。例如,员工数据库可能将您的员工编号作为主键,但它也可能对您的姓氏或部门有一个索引。
这两个索引(姓氏和部门)都将禁止 NULL(可能)并允许重复(几乎可以肯定),并且它们对于加快查找(例如)姓氏为“Corleone”的人很有用或在“杀手”部门工作。
【讨论】:
键(最小超键)是一组属性,其值对于每个元组(表中的每一行在某个时间点)都是唯一的。
索引是一种性能优化功能,可以更快地访问数据。
键通常是索引的良好候选者,并且一些 DBMS 会自动为键创建索引,但并非必须如此。
短语“索引键”混合了这两个完全不同的词,如果您想避免混淆,最好避免使用。 “索引键”有时用于表示“索引中的一组属性”。但是,所讨论的属性集不一定是键,因为它们可能不是唯一的。
【讨论】:
Oracle 数据库通过在唯一键或主键上创建唯一索引来对表实施唯一键或主键完整性约束。启用约束时,该索引由数据库自动创建。
您可以使用 SQL 语句 CREATE INDEX 显式创建索引(在完整性约束之外)。
索引可以是唯一的或非唯一的。唯一索引保证表的两行在键列(或列)中没有重复值。非唯一索引不会对列值施加此限制。
使用CREATE UNIQUE INDEX 语句创建唯一索引。
如果您需要更明确地控制与UNIQUE and PRIMARY KEY 约束关联的索引,数据库允许您:
1. Specify an existing index that the database is to use
to enforce the constraint
2. Specify a CREATE INDEX statement that the database is to use to create
the index and enforce the constraint
这些选项是使用USING INDEX 子句指定的。
例子:
CREATE TABLE a (
a1 INT PRIMARY KEY USING INDEX (create index ai on a (a1)));
http://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes003.htm
【讨论】:
其他响应正在定义主键,但不是主索引。
主索引不是主键上的索引。
主索引是您的表的数据结构,但前提是您的数据结构按主键排序,从而允许高效查找,而不需要单独的数据结构来按主键查找记录钥匙。
所有数据库(据我所知)都有一个主键。
并非所有数据库都有主索引。大多数默认情况下不在主键上构建二级索引。
【讨论】: