Q
卸下簇索引去除
2
A
回答
10
我假设你的PK属性从GUI工具,而不是从这样做SQL语句。 实际发生的,当您尝试删除已在PK中定义的聚集索引,它会做ALTER TABLE DROP CONSTRAINT第一,因为它无法做到对正在使用的PK的索引DROP INDEX语句(见this MSDN article,第二段)。您也不应该能够使用非聚集索引来做到这一点。
下面是一个例子...我创建了一个富表:
CREATE TABLE foo (id int primary key, value varchar(50))
这将创建一个自动聚集索引(即PK_foo_3213EXXXXXXXXX)
尝试从工具做到这一点(SQL管理工作室): 右键单击该表格中的PK_foo_3213EXXXXXXXX指数和做脚本索引 - >下降到...,看看它会产生...
它实际上是这样的:
/****** Object: Index [PK__foo__3213E83F7F60ED59] Script Date: 03/17/2011 11:49:57 ******/
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[foo]') AND name = N'PK__foo__3213E83F7F60ED59')
ALTER TABLE [dbo].[foo] DROP CONSTRAINT [PK__foo__3213E83F7F60ED59]
GO
说,如果我添加一个索引(唯一非群集)表像这样:
/****** Object: Index [test] Script Date: 03/17/2011 11:55:46 ******/
CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[foo]
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
,做同样的(脚本下降到),这是将要生成的脚本:
/****** Object: Index [test] Script Date: 03/17/2011 11:54:48 ******/
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[foo]') AND name = N'test')
DROP INDEX [test] ON [dbo].[foo] WITH (ONLINE = OFF)
GO
USE [dummy]
GO
注意不同之处(前一个是ALTER TABLE DROP CONSTRAINT,后面是DROP INDEX)。
如果试图武力SQL做到这一点的PK聚集索引:
DROP INDEX [PK__foo__3213E83F7F60ED59] ON [dbo].[foo]
你会得到这样的:
消息3723,级别16,状态4,第1行 一个明确的DROP索引'dbo.foo.PK_ foo _3213E83F7F60ED59'不允许使用INDEX。它被用于PRIMARY KEY约束执行。
因此SQL被迫做DROP约束来代替。
我不确定你的意思是你的第二条语句......如果你的意思是你已经在非聚集索引上定义了一个PK,并且你有另一个不是PK的聚集索引并且删除了该聚集索引。 ..然后是...那是将会发生的行为(你的PK约束不会被丢弃)。
为了好玩起见,尽量脚本DROP INDEX上是一个非聚集索引的PK ...并猜测它会产生什么样的脚本:)。提示提示... ALTER TABLE .... DROP ...约束
相关问题
- 1. 聚簇索引和非聚簇索引
- 2. 聚簇索引
- 3. 具有非聚簇索引但没有聚簇索引
- 4. 非主键列上的聚簇索引或非聚簇索引?
- 5. 全文索引vs %%和聚簇索引
- 6. SQL空间索引和聚簇索引
- 7. 改变聚簇索引列
- 8. SQL Server非聚簇索引
- 9. 簇索引的小桌子
- 10. 插入聚簇索引表
- 11. 了解聚簇索引
- 12. 卸下引号
- 13. 卸下炭在串从特定索引
- 14. SQL Server 2005聚簇索引删除运行时间很长,没有非聚簇索引存在
- 15. 应将主键聚簇索引列添加到非聚簇索引中?
- 16. SQL Server性能:非聚簇索引+ INCLUDE列与聚簇索引 - 等效吗?
- 17. 尽管有聚簇索引,SQL Server仍在使用非聚簇索引
- 18. 如何执行非聚簇索引查找而不是聚簇索引扫描
- 19. 混淆了聚簇索引和非聚簇索引。包含5个疑问
- 20. 聚簇索引扫描而不是聚簇索引寻求左连接
- 21. 保存B +树的聚簇索引和非聚簇索引的位置?
- 22. 如何用非聚集索引查找或聚簇索引查找替换聚簇索引扫描?
- 23. 带聚簇索引的文件表
- 24. 在nhibernate中设置聚簇索引
- 25. 聚簇索引或分区表?
- 26. 聚簇索引内部结构
- 27. SQL服务器行不聚簇索引
- 28. SqlServer聚簇索引存储(> 1列)?
- 29. Sybase非聚簇索引选择
- 30. 更改sybase中的非聚簇索引
什么是聚集索引的定义,你怎么去除呢? – JNK 2011-03-17 18:02:45
只需将ID列自动增量设置为PK即可。设置PK时会自动创建群集索引,并使用“唯一”复选框和选择ID列手动创建群集索引 – 2011-03-17 18:11:39