기존 테이블에 identity 속성을 추가하는 가장 빠른 방법
카테고리 없음 / 2024. 10. 22. 15:38
-- 테이블 스위치를 이용한 일반 컬럼에 identity 속성 추가
if object_id('t_product') is not null
drop table t_product
go
if object_id('t_product_identity') is not null
drop table t_product_identity
go
-- int 컬럼
create table t_product
( idx int not null
, shopid int
, productid int
, contentOtherCol char(400)
)
go
-- PK 인덱스를 추가한다.
alter table t_product add constraint PK_t_product primary key (idx)
go
with temp as
(
select
top 2000000 cast(row_number() over (order by (select 1)) as int) idx
, cast('contents other column' as char(400)) contentOtherCol
from sys.objects a1
cross join sys.objects a2
cross join sys.objects a3
cross join sys.objects a4
cross join sys.objects a5
)
insert into t_product (idx, shopid, productid, contentOtherCol)
select
idx
, cast(abs(checksum(newid())) % 2 as int) shopid
, cast(abs(checksum(newid())) % 100000 as int) productid
, contentOtherCol
--into t_product
from temp
go
-- 교체할 테이블 생성 identity 가 있는 테이블
create table t_product_identity
( idx int identity(1,1) not null
, shopid int
, productid int
, contentOtherCol char(400)
)
go
alter table t_product_identity add constraint PK_t_product_identity primary key (idx)
go
-- identity 없는 테이블과 idneitty 있는 테이블의 스키마를 바꿔치기 한다.
alter table t_product switch to t_product_identity
go
-- 테이블 삭제
drop table t_product
go
-- 이름 변경
exec sp_rename 't_product_identity','t_product'
go
-- 인덱스 이름 변경
exec sp_rename 't_product.PK_t_product_identity', 'PK_t_product';
go
select top 10 * from t_product
go
-- 0 으로 출력됨
select IDENT_CURRENT( 't_product' )
go
-- modify identity value
declare @max int
select @max=max(idx) from t_product
if @max IS NULL --check when max is returned as null
SET @max = 0
select @max
DBCC CHECKIDENT ('t_product', RESEED, @max)
go
-- 현재 max 값으로 셋팅 확인
select IDENT_CURRENT( 't_product' )
go
-- 이름 확인
exec sp_helpindex t_product
go
-- identity 속성 확인
exec sp_help t_product
go