【问题标题】:Drop Default Clustered Index Without Knowing it's Name在不知道其名称的情况下删除默认聚集索引
【发布时间】:2012-07-23 20:39:15
【问题描述】:

我编写了一个脚本来创建一些表(如果它们存在,它之前会删除它们),然后尝试在每个表上创建两个索引。

第一个索引使用主键列创建非聚集索引,第二个使用另一列创建聚集索引。这是因为主键列是 GUID 而不是 int。

如果我不知道默认索引的名称,如何删除它?或者如何为主键列索引指定名称以便删除它?或者更好的是,如何在 Create Table 语句中指定我需要的 2 索引?

【问题讨论】:

  • 主键的创建是:[GID] [uniqueidentifier] NOT NULL PRIMARY KEY, 我没有将其设置为集群。索引名称也类似于PK__[Table]__C51F0F3E60620756。
  • 如果您未明确告诉 PK NONCLUSTERED - 那么它就是集群的。
  • 所以尝试使用:[GID] [uniqueidentifier] NOT NULL PRIMARY KEY **NONCLUSTERED**

标签: sql sql-server-2008 indexing


【解决方案1】:
SELECT * FROM sys.indexes

但是,我不明白在您的流程中实际上必须删除索引的位置。

您说您正在创建一些表,然后在每个表上创建两个索引。

如果您在开始时 DROPping 现有表,则会自动删除所有索引。

没有默认索引这样的东西。

表可以是堆或聚集索引。如果删除聚集索引,则表将转换为堆,并且必须更新任何非聚集索引以指向无序堆中的数据。

你可以像这样一次性创建:

CREATE TABLE dbo.tbl
(
    Id int NOT NULL IDENTITY (1, 1) CONSTRAINT UK_ID UNIQUE CLUSTERED,
    SomeUUID UNIQUEIDENTIFIER NOT NULL CONSTRAINT PK_SomeUUID PRIMARY KEY NONCLUSTERED
)

这是一个 SQLFiddle:http://sqlfiddle.com/#!6/d759e/12

【讨论】:

  • 当我创建表时,默认情况下会在主键上创建一个聚集索引,我需要一种在另一列中拥有聚集索引并将主列用作非聚集索引的方法.
  • @PedroC88 您可以在创建过程中指定 PRIMARY KEY NONCLUSTERED。
  • @PedroC88 我添加了一个 SQLFiddle
【解决方案2】:

您可以在创建表后立即定义两个索引:

CREATE TABLE dbo.YourTable ( ...... )
GO

ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable PRIMARY KEY NONCLUSTERED (YourGuidColumn)
                                      ****************
                  this is crucial ! Otherwise, your PK will be clustered!


CREATE CLUSTERED INDEX IX01_YourTable ON dbo.YourTable(YourOtherColumn)

or even better:  
CREATE UNIQUE CLUSTERED INDEX IX01_YourTable ON dbo.YourTable(YourOtherColumn)

这应该在单独的列上创建一个非聚集主键和一个单独的(最好是唯一的)聚集索引。

【讨论】:

  • 我有一个与此非常相似的脚本,但它给了我一个错误,因为我正在尝试创建一个聚集索引,而表已经有一个。
  • @PedroC88:在这种情况下,您很可能没有在创建主键时明确指定NONCLUSTERED;如果您忽略它,那么主键将被创建为作为聚集索引。
猜你喜欢
  • 2021-01-05
  • 2013-08-06
  • 2010-11-28
  • 2010-11-23
  • 2012-02-18
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
相关资源
最近更新 更多