SQL Server给一个表增加主键会自动在主键列上建立一个聚集索引,或者给一个表增加一个唯一约束也会自动增加一个唯一索引,对于通过主键和唯一约束创建的索引是不能够通过DROP INDEX来删除的。
我们做一个试验,先创建一个表t,其中id列非空
create table t(id int not null, name varchar(20));
在id列上建PK
alter table t add constraint pk_t primary key(id);
这时候会自动创建一个名叫pk_t 的聚集索引。
如果我们要删除主键或者删除这个聚集索引,使用drop index t.pk_t命令,或者在资源管理器中删除,会看到如下的错误提示:
标题: Microsoft SQL Server Management Studio
------------------------------
删除 对于 索引“pk_t”失败。 (Microsoft.SqlServer.Smo)
有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.1399.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=删除+Index&LinkId=20476
------------------------------
其他信息:
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
An explicit DROP INDEX is not allowed on index 'dbo.t.pk_t'. It is being used for PRIMARY KEY constraint enforcement. (Microsoft SQL Server,错误: 3723)
如果我们确实需要删除这个主键,可以采用下面的方法:
通过删除主键约束来自动删除由该主键约束创建出来的聚集索引
alter table t drop constraint t_pk
现在可以看到这个表上的由添加主键约束而创建出来的聚集索引随着主键的删除而自动删除了。
对于删除通过唯一约束创建的唯一索引,原理是类似的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10640532/viewspace-566952/ ,如需转载,请注明出处,否则将追究法律责任。