MS Access에서 가져온 레거시 데이터베이스로 작업하고 있습니다. MS Access> SQL Server 업그레이드 중에 생성 된 클러스터되지 않은 고유 한 기본 키가있는 약 20 개의 테이블이 있습니다.
이러한 많은 테이블에는 기본 키의 복제 본인 고유 한 클러스터되지 않은 인덱스도 있습니다.
이것을 정리하려고합니다.
그러나 내가 찾은 것은 기본 키를 클러스터형 인덱스로 다시 만든 다음 외래 키를 다시 작성하려고 시도하면 외래 키가 이전의 중복 인덱스 (고유 한)를 참조하는 것입니다.
중복 인덱스를 삭제하지 않기 때문에 이것을 알고 있습니다.
SQL Server가 항상 기본 키를 선택한다고 생각합니다. SQL Server에는 고유 인덱스와 기본 키 중에서 선택할 수있는 방법이 있습니까?
SQL Server 2008 R2에서 문제를 복제하려면
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child
GO
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent
GO
-- Create the parent table
CREATE TABLE Parent (ParentID INT NOT NULL IDENTITY(1,1))
-- Make the parent table a heap
ALTER TABLE Parent ADD CONSTRAINT PK_Parent PRIMARY KEY NONCLUSTERED (ParentID)
-- Create the duplicate index on the parent table
CREATE UNIQUE NONCLUSTERED INDEX IX_Parent ON Parent (ParentID)
-- Create the child table
CREATE TABLE Child (ChildID INT NOT NULL IDENTITY(1,1), ParentID INT NOT NULL )
-- Give the child table a normal PKey
ALTER TABLE Child ADD CONSTRAINT PK_Child PRIMARY KEY CLUSTERED (ChildID)
-- Create a foreign key relationship with the Parent table on ParentID
ALTER TABLE Child ADD CONSTRAINT FK_Child FOREIGN KEY (ParentID)
REFERENCES Parent (ParentID) ON DELETE CASCADE NOT FOR REPLICATION
-- Try to clean this up
-- Drop the foreign key constraint on the Child table
ALTER TABLE Child DROP CONSTRAINT FK_Child
-- Drop the primary key constraint on the Parent table
ALTER TABLE Parent DROP CONSTRAINT PK_Parent
-- Recreate the primary key on Parent as a clustered index
ALTER TABLE Parent ADD CONSTRAINT PK_Parent PRIMARY KEY CLUSTERED (ParentID)
-- Recreate the foreign key in Child pointing to parent ID
ALTER TABLE Child ADD CONSTRAINT FK_Child FOREIGN KEY (ParentID)
REFERENCES Parent (ParentID) ON DELETE CASCADE NOT FOR REPLICATION
-- Try to drop the duplicate index on Parent
DROP INDEX IX_Parent ON Parent
오류 메시지 :
메시지 3723, 수준 16, 상태 6, 줄 36 인덱스 'Parent.IX_Parent'에는 명시 적 DROP INDEX가 허용되지 않습니다. FOREIGN KEY 제약 조건 적용에 사용되고 있습니다.