删除默认的聚簇索引而不知道它的名称

时间:2012-07-23 20:39:16

标签: sql sql-server-2008 indexing

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

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

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

2 个答案:

答案 0 :(得分:3)

SELECT * FROM sys.indexes

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

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

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

没有默认索引。

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

您可以一次性创建:

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

答案 1 :(得分:3)

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

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)

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