본문 바로가기

SQL Server/SQL Server Tip & Tech

NON-IDENTITY 컬럼을 IDENTITY 컬럼으로 바꾸기

(출처 : http://www.sqlservercentral.com/articles/T-SQL/61979/)

SQL Server 2005의 "ALTER TABLE ~ SWITCH ~ TO  ~" 구문을 응용한 방법만 발췌하여 소개합니다.

1. 원본 테이블을 참조하는 모든 참조키를 DROP 한다.
2. 원본 테이블을 SCHEMABINDING 하는 모든 개체를 수정한다. (SCHEMABINDING 하지 않도록~)
3. 원본 테이블의 모든 인덱스를 DROP 한다.
4. 원본 테이블과 동일한 레이아웃의 테이블을 생성한다. 단, IDENTITY 속성을 가지도록 한다.
5. 원본 테이블에서 사본 테이블로 파티션을 스위치한다.
6. 원본 테이블을 DROP 한다.
7. 사본 테이블의 이름을 원본 테이블의 이름으로 변경한다. (sp_rename)
8. 참조키를 재 생성한다.
9. 인덱스를 재 생성한다.
10. 2항의 개체에 대해 SCHEMABINDING하도록 수정한다.
11. 그 밖의 제약 조건이 있었다면, 생성한다.


데모 코드입니다.

NON-IDENTITY 컬럼을 가진 원본 테이블 생성

CREATE TABLE dbo.SOURCE_TB (

        id int NOT NULL,

        date datetime,

        cost money

);

 

INSERT dbo.SOURCE_TB (id) VALUES(1);

INSERT dbo.SOURCE_TB (id) VALUES(2);

INSERT dbo.SOURCE_TB (id) VALUES(3);



동일한 레이아웃의 사본 테이블 생성. 단, IDENTITY 속성을 가지도록~

DECLARE @id int;

 

SELECT @id = ISNULL(MAX(id), 0) + 1 FROM dbo.SOURCE_TB;

 

EXEC ('

CREATE TABLE dbo.DESTINATION_TB (

        id int IDENTITY(' + @id + ', 1) NOT NULL,

        date datetime,

        cost money

)')


파티션 스위치

ALTER TABLE dbo.SOURCE_TB SWITCH TO dbo.DESTINATION_TB



원본 테이블 삭제

DROP TABLE dbo.SOURCE_TB



사본 테이블의 이름을 원본 테이블의 이름으로 변경
EXEC sp_rename 'DESTINATION_TB' ,'SOURCE_TB'