2011-03-17 3 views
2

클러스터 된 인덱스 (PK 열에 설정)를 제거하면 열 정의에서 PK 특성이 제거됩니다. 거래는 뭐니?클러스터 된 인덱스 제거로 인해 PK가 제거됩니다.

나는 테이블에 클러스터되지 않은 인덱스를하고 난 후 내가 당신을 가정하고

+1

클러스터 된 인덱스의 정의는 무엇이며 어떻게 제거 했습니까? – JNK

+0

ID 열 자동 증분 만 PK로 설정됩니다.클러스터 된 인덱스는 PK를 설정할 때 자동으로 만들어지며 '고유'확인란을 사용하여 수동으로 만들고 ID 열을 선택합니다. –

답변

10

열 정의에서 PK 속성을 제거하지 않는 GUI 도구 및하지에서에서이 작업을 수행하는 클러스터 된 인덱스를 제거하는 경우 SQL 문. PK에 정의 된 클러스터 된 인덱스를 삭제하려고하면 실제로 PK에 의해 사용되는 인덱스에서 DROP INDEX 문을 수행 할 수 없으므로 ALTER TABLE DROP CONSTRAINT가 먼저 수행됩니다 (this MSDN article, 두 번째 단락 참조). Non-Clustered 인덱스에서도이 작업을 수행 할 수 없습니다.

CREATE TABLE foo (id int primary key, value varchar(50)) 

이 자동으로 클러스터 된 인덱스 (즉 PK_foo_3213EXXXXXXXXX) 도구에서이 작업을 수행하는

시도를 생성합니다 (SQL 관리 스튜디오 : 여기

은 예입니다 ... 나는 푸 테이블을 생성

: - :) 실제로이의 ...

을> DROP에 ... 그것이 생성을 확인 오른쪽 그 테이블에서 PK_foo_3213EXXXXXXXX 지수를 클릭하고 스크립트 색인을 내가 다른 인덱스를 추가하면3210

/****** 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 

그리고 (에 DROP으로 스크립트) 동일한 작업을 수행,이 생성됩니다 스크립트가 있습니다 :

/****** 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 표 DROP 제약, 그리고 나중에 낙하 INDEX이다). 당신이 얻을 것이다

DROP INDEX [PK__foo__3213E83F7F60ED59] ON [dbo].[foo] 

: 당신은 PK에 이렇게 힘 SQL을하려고하면

는 인덱스를 클러스터

3723 메시지, 수준 16, 상태 4, 줄 1 명시 적 DROP INDEX는 'dbo.foo.PK_ foo _3213E83F7F60ED59'색인에는 허용되지 않습니다. PRIMARY KEY 제약 조건 적용에 사용됩니다.

따라서 SQL은 DROP CONSTRAINT를 강제 실행합니다.

두 번째 if 문이 무슨 뜻인지 확실치 않습니다. 클러스터되지 않은 인덱스에서 PK를 정의했으며 PK가 아니고 클러스터 된 인덱스가 다른 클러스터 된 인덱스가있는 경우에 해당합니다. .. then yes ... 그 행동이 일어날 것입니다 (당신의 PK 제약은 삭제되지 않을 것입니다).

재미 있기 때문에 비 클러스터형 인덱스에있는 PK에 DROP INDEX를 스크립 트 해보고 어떤 스크립트가 생성되는지 추측하십시오. :). 힌트 힌트 ... ALTER TABLE .... DROP ... CONSTRAINT

관련 문제