当另一个索引聚集时,是否可以使主键不聚集?

时间:2019-08-29 12:23:00

标签: sql-server indexing

在我的表中,我以ID作为主键,这只是毫无意义的唯一代码

因为它是SQL Server 2017的主键,所以使其成为群集。

我的表中还有另一列myTime,这是带有非uinique非聚集索引的时间戳记

我可以使PK成为非聚类并且索引是聚类的吗?

2 个答案:

答案 0 :(得分:1)

是的,可以通过指定主键为非集群键。

ALTER TABLE TableName
ADD CONSTRAINT PK_name PRIMARY KEY NONCLUSTERED (ID);

您通过指定聚簇索引使另一个索引聚簇。

CREATE CLUSTERED INDEX IX_Name   
    ON dbo.TableName (ColumnName);

答案 1 :(得分:1)

可以。如果您已经有一个表,则需要:

  1. 丢弃当前群集的PRIMARY KEY
  2. 创建您的CLUSTERED INDEX
  3. 创建一个PRIMARY KEY NONCLUSTERED

例如:

IF OBJECT_ID('tempdb..#Test') IS NOT NULL
    DROP TABLE #Test

CREATE TABLE #Test (
    ID INT, 
    TimeStamp DATETIME,
    CONSTRAINT PK_Test PRIMARY KEY (ID)) -- Clustered by default


ALTER TABLE #Test DROP PK_Test

CREATE CLUSTERED INDEX CI_Test_TimeStamp ON #Test (TimeStamp)

ALTER TABLE #Test ADD CONSTRAINT PK_Test PRIMARY KEY NONCLUSTERED (ID)

唯一强制实施唯一性的是PRIMARY KEY约束,尽管可能会引起性能的困扰,但您仍然可以在重复值上具有聚簇索引。有关详细信息,请参见Eric的链接。