1

몇 달 전에 주 테이블에서 기본 키에 대한 Guids를 사용하는 응용 프로그램을 인수했습니다. 우리는 최근에 인덱스와 관련된 데이터베이스 문제를 겪어 왔고, 나는 Guids를 기본 키로 사용하는 것에 대해 읽었으며, 그들이 얼마나 나쁜 생각인지를 배웠고, 데이터베이스가 너무 커지기 전에 데이터베이스를 변경해야합니다. INTS으로 변경하는 쉬운 방법이 있는지GUID 기본 키를 정수 기본 키로 변경

궁금하네요? 이 일을 할 놀라운 소프트웨어가 있습니까? 아니면 내게 달린거야?

나는 적절한 Int 테이블을 추가 할 생각이었습니다. CreationDate 컬럼을 기반으로 1 - n으로이 컬럼에 poplate하는 코드를 작성하고, 관련된 모든 테이블의 컬럼을 채우기 위해 코드를 작성한 다음, 전환했습니다. 새로운 int 열과의 관계. 너무 힘들지는 않겠지 만 ... 이것이 최선의 방법일까요?

+1

은 왜 그냥 http://stackoverflow.com/questions/3698793/how-to-add-a-new-identity-column-to-a-table-in-sql-server를 기반으로 뭔가를 할 수 없습니다 –

+2

확인 http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any-data-loss/6086661#6086661에서 http : // 유래. 질문과 대답 17040124/add-an-identity-column-existing-table-as-the-primary-key-and-change-order –

+1

내가 한 것은 여러 단계의 과정이었습니다. (1) (2) 모든 외래 키 제약 조건 삭제, (3) 영향을받는 테이블의 모든 기본 키 삭제, (4) 해당 테이블에 새로운 ID INT 열 생성 (5) 외래 키 제약 조건을 복원합니다. 이 모든 스크립트는 매우 쉽게 작성할 수 있습니다. –

답변

0

위의 모든 링크에서 조각을 결합 후, 나는 대답을 위해 단순화,이 스크립트를 내놓았다. 그것이 내가 (관계를 삭제 그렇다) 원래 작업 테이블을 터치하지 않았 음을 의미하기 때문에

테이블 변경

JOB 
Id Guid PK 
Name nvarchar 
CreationDate datetime 

REPORT 
Id Guid PK 
JobId int 
Name nvarchar 
CreationDate datetime 

SCRIPT

-- Create new Job table with new Id column 
select JobId = IDENTITY(INT, 1, 1), Job.* 
into Job2 
from Job 
order by CreationDate 


-- Add new JobId column to Report 
alter table Report add JobId2 int 

-- Populate new JobId column 
update Report 
set Report.JobId2 = Job2.JobId 
from Job2 
where Report.JobId = Job2.Id 

-- Delete Old Id 
ALTER TABLE Job2 DROP COLUMN Id 

-- Delete Relationships 
ALTER TABLE Report DROP CONSTRAINT [FK_Report_Job] 
ALTER TABLE Job DROP CONSTRAINT PK_Job 

-- Create Relationships 
ALTER TABLE [dbo].[Job2] ADD CONSTRAINT [PK_Job] PRIMARY KEY CLUSTERED 
([JobId] ASC) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 

ALTER TABLE [dbo].[Report] WITH CHECK ADD CONSTRAINT [FK_Report_Job] FOREIGN KEY([JobId2]) 
REFERENCES [dbo].[Job2] ([JobId]) 
ON DELETE CASCADE 
ALTER TABLE [dbo].[Report] CHECK CONSTRAINT [FK_Report_Job] 


-- Rename Columns 
sp_RENAME 'Report.JobId', 'OldJobId' , 'COLUMN' 
sp_RENAME 'Report.JobId2', 'JobId' , 'COLUMN' 

-- Rename Tables 
sp_rename Job, Job_Old 
sp_rename Job2, Job 

전에 나는 그래서, 작업 2 테이블을 생성 무언가가 나 빠지면 모든 것을 원래의 상태로 쉽게 되돌릴 수 있습니다.

관련 문제