【问题标题】:Can I have a primary key without clustered index ? Also can I have multivalued clustered index?我可以有一个没有聚集索引的主键吗?我也可以有多值聚集索引吗?
【发布时间】:2012-08-05 13:50:53
【问题描述】:

各位,我想了解以下问题的答案:

  1. 我可以有一个没有聚集索引的主键吗? (我知道当我们在列上创建主键约束时,它默认会创建一个聚集索引。那么在这种情况下,我应该如何停用聚集索引?)

  2. 我可以有一个包含多个列的聚集索引吗? (比如在非聚集索引中,我可以为单个非聚集索引加入不同的列)。

【问题讨论】:

    标签: mysql sql sql-server clustered-index


    【解决方案1】:

    MySQLSQL-SERVER 是不同的 RDBMS。它们具有不同的功能和不同的语法。

    在使用 InnoDB 时,MySQL 始终使 PK 成为聚集索引。

    但是,SQL-SERVER 将允许您创建不带 CLUSTERED 关键字的 PK,并允许您在另一个索引中使用它。

    在这两种情况下,PrimaryKeys 和 Indexes(无论是否聚集)都可以覆盖多个字段。

    【讨论】:

    • 此外,即使您没有主键,InnoDB 也始终具有聚集索引。
    • @Dems:嗨,Dems,谢谢您的回答。道歉,我不知道 InnoDB 是什么,我是新手,对愚蠢的问题感到抱歉。而且,如何在没有 Clluetersted 索引的情况下创建 PK?我的意思是,如果我只是创建一个带有语法并提及主键的表,或者使用 GUI 工具创建表,我只需勾选我需要作为主键的列。我真的很新:(希望你明白我到底在做什么:(我需要知道实现它的具体方法。
    • 声明 SQL-SERVER ... will let you create a PK without the CLUSTERED keyword, and let you use it within another index instead. 不正确 -- 默认情况下省略 CLUSTERED 关键字仍会创建聚集索引。您必须使用 NONCLUSTERED 关键字。
    【解决方案2】:

    (此答案仅适用于 SQL Server 2005+。我对 MySQL 一无所知。)


    我可以有一个没有聚集索引的主键吗?

    是的。正如您所提到的,默认情况下,主键约束由聚集索引支持。您可以通过如下声明约束来告诉 SQL Server 使用非聚集索引支持约束:

    ALTER TABLE MyTable
        ADD CONSTRAINT PK_MyTable
            PRIMARY KEY NONCLUSTERED(Col1);
    

    我可以有一个包含多个列的聚集索引吗? (比如在非聚集索引中,我可以为单个非聚集索引加入不同的列)。

    是的,您可以在索引键中定义具有多列的索引。它与非聚集索引真的没有什么不同。

    CREATE UNIQUE CLUSTERED INDEX IX_MyTable_Clus
        ON MyTable(Col1, Col2, Col3);
    

    参考:ALTER TABLECREATE INDEX

    【讨论】:

    • 以我可以咀嚼/消化的方式完美地回答了我的问题。非常感谢 :) :) 干杯
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2022-12-29
    • 2012-09-25
    • 2012-06-03
    • 2011-06-04
    • 1970-01-01
    • 2011-07-26
    • 2011-05-15
    相关资源
    最近更新 更多