我编写了一个脚本来创建一些表(如果它们存在,它以前会删除它们),然后尝试在每个表上创建两个索引。
第一个索引使用主键列创建非聚集索引,第二个索引使用另一列创建聚集索引。这是因为主键列是 GUID 而不是 int。
如果我不知道它的名称,如何删除默认索引?或者如何为主键列索引指定名称以便删除它?或者更好的是,如何在 Create Table 语句中指定我需要的 2 索引?
我编写了一个脚本来创建一些表(如果它们存在,它以前会删除它们),然后尝试在每个表上创建两个索引。
第一个索引使用主键列创建非聚集索引,第二个索引使用另一列创建聚集索引。这是因为主键列是 GUID 而不是 int。
如果我不知道它的名称,如何删除默认索引?或者如何为主键列索引指定名称以便删除它?或者更好的是,如何在 Create Table 语句中指定我需要的 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)
这应该在单独的列上创建一个非聚集主键和一个单独的(最好是唯一的)聚集索引。
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