-1

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

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

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

4

2 回答 2

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)

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

于 2012-07-23T20:56:51.627 回答
3
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

于 2012-07-23T20:45:27.597 回答