【问题标题】:What is the difference between a primary key and a index key主键和索引键有什么区别
【发布时间】:2011-03-21 07:31:20
【问题描述】:

谁能告诉我主键和索引键有什么区别。什么时候用哪个?

【问题讨论】:

    标签: database primary-key


    【解决方案1】:

    主键是一种特殊的索引:

    • 只能有一个;
    • 不能为空;和
    • 它必须是唯一的。

    您倾向于将主键用作一行最自然的唯一标识符(例如社会保险号、员工 ID 等,尽管有一种观点认为您应该始终为此使用人工代理键)。

    另一方面,索引可用于基于其他列的快速检索。例如,员工数据库可能将您的员工编号作为主键,但它也可能对您的姓氏或部门有一个索引。

    这两个索引(姓氏和部门)都将禁止 NULL(可能)并允许重复(几乎可以肯定),并且它们对于加快查找(例如)姓氏为“Corleone”的人很有用或在“杀手”部门工作。

    【讨论】:

    • 你应该提到主键总是被索引的,这意味着主键也总是索引键。
    • @Gabe,我认为只是说明主键是一种索引。声明索引已编入索引对我来说似乎有点多余,但如果您能提出可行的更改(我不能,但这可能只是我的限制),我会欢迎输入。
    • 键不是索引!键(最小超键)是一组属性,其值对于每个元组都是唯一的。索引是一种性能优化功能,可以更快地访问数据。
    • 好吧,也许“主键总是被索引,但与索引键相比是特殊的:”?
    • @Gabe 主键必须始终被索引并没有根本原因,尽管这样做通常是个好主意。键和索引是根本不同且不相关的东西 - 不要混淆它们。
    【解决方案2】:

    键(最小超键)是一组属性,其值对于每个元组(表中的每一行在某个时间点)都是唯一的。

    索引是一种性能优化功能,可以更快地访问数据。

    键通常是索引的良好候选者,并且一些 DBMS 会自动为键创建索引,但并非必须如此。

    短语“索引键”混合了这两个完全不同的词,如果您想避免混淆,最好避免使用。 “索引键”有时用于表示“索引中的一组属性”。但是,所讨论的属性集不一定是键,因为它们可能不是唯一的。

    【讨论】:

    • 也就是说,'key'和'primary key'是等价的吗?
    • 真正的“主”键与非主键没有区别。
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

      其他响应正在定义主键,但不是主索引。

      主索引不是主键上的索引。

      主索引是您的表的数据结构,但前提是您的数据结构按主键排序,从而允许高效查找,而不需要单独的数据结构来按主键查找记录钥匙。

      所有数据库(据我所知)都有一个主键。

      并非所有数据库都有主索引。大多数默认情况下不在主键上构建二级索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 2020-08-22
        • 1970-01-01
        相关资源
        最近更新 更多