Я предполагаю, что вы делаете это из инструмента GUI, а не из оператора SQL.Что на самом деле происходит, когда вы пытаетесь удалить кластеризованный индекс, определенный на ПК, сначала он выполнит команду ALTER TABLE DROP CONSTRAINT, так как не сможет выполнить инструкцию DROP INDEX для индекса, который используется PK (см. эту статью MSDN , второй абзац).Вы также не сможете сделать это с некластеризованным индексом.
Вот пример ... Я создал таблицу Foo:
CREATE TABLE foo (id int primary key, value varchar(50))
, это создаст автоматическийкластеризованный индекс (т. е. PK_foo_3213EXXXXXXXXX)
Попробуйте сделать это с помощью инструмента (SQL Management studio): щелкните правой кнопкой мыши индекс PK_foo_3213EXXXXXXXX из этой таблицы и выполните Script Index As -> DROP to ... и посмотрите, что этобудет генерировать ...
На самом деле это так:
/****** 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
И сделайте то же самое (Script as DROP to), этот сценарий будет сгенерирован:
/****** 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 INDEX недопустим для индекса 'dbo.foo.PK_ foo _3213E83F7F60ED59.Он используется для применения ограничения PRIMARY KEY.
Таким образом, SQL вынужден вместо этого выполнять DROP CONSTRAINT.
Я не уверен, что вы подразумеваете под вторым оператором if ..... если вы имеете в виду, что вы определили PK для некластеризованного индекса, и у вас есть другой кластеризованный индекс, который не является PK, и отбросьте этот кластеризованный индекс ... тогда да ... именно так и будет (ваше ограничение PK будетне пропадать).
Ради интереса попробуйте написать скрипт DROP INDEX на ПК, который находится в некластеризованном индексе ... и угадать, какой скрипт он сгенерирует :).Подсказка, подсказка ... ALTER TABLE .... DROP ... CONSTRAINT