首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果存在聚集索引,如何在表上删除聚集索引并添加新的聚集索引?

如果存在聚集索引,如何在表上删除聚集索引并添加新的聚集索引?
EN

Stack Overflow用户
提问于 2020-03-02 12:17:21
回答 1查看 8.7K关注 0票数 1

我正在创建一个表上的聚集索引,如果它已经存在,我将删除它。

我正在使用这个查询。

代码语言:javascript
运行
复制
DROP INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment
CREATE INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC);

现在,我想知道在这里创建哪个集群:-这是集群还是非集群?

代码语言:javascript
运行
复制
CREATE INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC);

因为使用:-

代码语言:javascript
运行
复制
DROP clustered INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment 

我收到一个错误:-

代码语言:javascript
运行
复制
Incorrect syntax near the keyword 'clustered'.

如果我用:-

代码语言:javascript
运行
复制
DROP INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment
go
CREATE clustered INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC); 

我收到一个错误:-

代码语言:javascript
运行
复制
Cannot create more than one clustered index on table 'Enrollment'. Drop the existing clustered index 'PK__enrollme__DE799CE1E4649295' before creating another.

现在,在我的第二个查询中,我想知道创建了哪个索引。如果两者都没有被创建,那么如何删除聚集索引,如果它存在,并创建一个新的索引。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-02 12:22:31

可以尝试使用IF EXISTS语法检查sys.indexes表是否包含索引。

代码语言:javascript
运行
复制
IF EXISTS(
    SELECT * 
    FROM sys.indexes 
    WHERE name='CLX_Enrolment_StudentID_BatchID' AND OBJECT_ID = OBJECT_ID('Enrollment')
)
BEGIN
    DROP INDEX CLX_Enrolment_StudentID_BatchID ON [dbo].[Enrollment]
END
GO

CREATE clustered INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC); 

但我认为您的表上有一个来自错误消息的索引PK__enrollme__DE799CE1E4649295

修改

如果您想要自动创建DROP PK或聚集索引,可以尝试使用动态sql创建脚本,并使用sp_executesql执行该脚本。

代码语言:javascript
运行
复制
DECLARE @sql NVARCHAR(500),
        @TableName VARCHAR(50) = 'Enrollment',
        @Para NVARCHAR(500)='@TableName VARCHAR(50)'

SELECT @sql = CONCAT('ALTER TABLE ',@TableName,' DROP CONSTRAINT ',name)
FROM sys.indexes 
WHERE OBJECT_ID = OBJECT_ID(@TableName) AND type_desc = 'CLUSTERED' AND is_primary_key = 1
EXEC sp_executesql @sql,@Para,@TableName

SELECT @sql = CONCAT('DROP INDEX ',name,' ON dbo.',@TableName)
FROM sys.indexes 
WHERE OBJECT_ID = OBJECT_ID(@TableName) AND type_desc = 'CLUSTERED'

EXEC sp_executesql @sql,@Para,@TableName

如果您的表已经包含PK,则需要使用ALTER TABLE .... DROP CONSTRAINT而不是drop index.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60488690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档