【发布时间】:2012-08-05 13:50:53
【问题描述】:
各位,我想了解以下问题的答案:
我可以有一个没有聚集索引的主键吗? (我知道当我们在列上创建主键约束时,它默认会创建一个聚集索引。那么在这种情况下,我应该如何停用聚集索引?)
我可以有一个包含多个列的聚集索引吗? (比如在非聚集索引中,我可以为单个非聚集索引加入不同的列)。
【问题讨论】:
标签: mysql sql sql-server clustered-index
各位,我想了解以下问题的答案:
我可以有一个没有聚集索引的主键吗? (我知道当我们在列上创建主键约束时,它默认会创建一个聚集索引。那么在这种情况下,我应该如何停用聚集索引?)
我可以有一个包含多个列的聚集索引吗? (比如在非聚集索引中,我可以为单个非聚集索引加入不同的列)。
【问题讨论】:
标签: mysql sql sql-server clustered-index
MySQL 和 SQL-SERVER 是不同的 RDBMS。它们具有不同的功能和不同的语法。
在使用 InnoDB 时,MySQL 始终使 PK 成为聚集索引。
但是,SQL-SERVER 将允许您创建不带 CLUSTERED 关键字的 PK,并允许您在另一个索引中使用它。
在这两种情况下,PrimaryKeys 和 Indexes(无论是否聚集)都可以覆盖多个字段。
【讨论】:
SQL-SERVER ... will let you create a PK without the CLUSTERED keyword, and let you use it within another index instead. 不正确 -- 默认情况下省略 CLUSTERED 关键字仍会创建聚集索引。您必须使用 NONCLUSTERED 关键字。
(此答案仅适用于 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);
【讨论】: