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. 插入聚簇索引表
- 6. 改变聚簇索引列
- 7. 卸下炭在串从特定索引
- 8. 混淆了聚簇索引和非聚簇索引。包含5个疑问
- 9. SQL Server性能:非聚簇索引+ INCLUDE列与聚簇索引 - 等效吗?
- 10. 尽管有聚簇索引,SQL Server仍在使用非聚簇索引
- 11. Azure无法识别聚簇索引
- 12. H2数据库:聚簇索引支持
- 13. 更改sybase中的非聚簇索引
- 14. 在nhibernate中设置聚簇索引
- 15. SqlServer聚簇索引存储(> 1列)?
- 16. 带聚簇索引的文件表
- 17. MySql错误1064唯一聚簇索引
- 18. Sybase非聚簇索引选择
- 19. 为什么SQL索引视图始终使用聚簇索引
- 20. SQL Server索引 - HEAP上的非聚簇索引
- 21. 已过滤索引与正常非聚簇索引
- 22. 去除与jquery卸下摆臂()DOM元素
- 23. 在SQL中禁用聚簇索引的方法和哪个列会创建默认非聚簇索引?
- 24. 包含vs的非聚簇索引与几乎相同的非聚簇索引无关;多个查询范围
- 25. SQL Server中唯一标识符列上的聚簇/非聚簇索引
- 26. 划分数组索引除下一个索引Java
- 27. 重建索引不会更改非聚簇索引的碎片百分比
- 28. 删除索引
- 29. 如何卸载/删除引擎?
- 30. 在索引到elasticsearch之前去除HTML标签
什么是聚集索引的定义,你怎么去除呢? – JNK 2011-03-17 18:02:45
只需将ID列自动增量设置为PK即可。设置PK时会自动创建群集索引,并使用“唯一”复选框和选择ID列手动创建群集索引 – 2011-03-17 18:11:39