2011-03-17 67 views
2

PK。这是怎么回事?卸下簇索引去除

如果我有表上的非聚集索引和删除了聚集索引那么它不会删除列定义

+1

什么是聚集索引的定义,你怎么去除呢? – JNK 2011-03-17 18:02:45

+0

只需将ID列自动增量设置为PK即可。设置PK时会自动创建群集索引,并使用“唯一”复选框和选择ID列手动创建群集索引 – 2011-03-17 18:11:39

回答

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 ...约束