2015년 3월 20일 금요일

MsSql 테이블 복제

테이블을 복사 해보자.


샘플 테이블이며 8개의 데이터가 들어 있다.


이 중, intSeq 필드는 PK 이며, 자동증가값으로 지정되어 있다.
이런 테이블을 복사 하는 가장 간단한 방법은.


이렇게 ,

select * into [만들테이블] from [원본테이블]

... 로 지정해 쿼리를 실행하는 것이다.
이렇게 하면 아주 쉽게 테이블을 복사 할 수 있다. 하지만...


이렇게 데이터는 잘 들어가 있지만...


보다시피 테이블 설정은 없어진다. (PK 지정도 안되어 있고, 당연히 자동증가값 옵션도 없어진다.)
즉, 위의 쿼리로는 테이블 형태와 데이터만 복사되어 질 뿐, 그 외 모든 데이터는 없어진다.

테이블 정보를 모두 가진 테이블을 복사 하려면 어떻게 하면 될까?
이 문제는 해결 할려면, 몇가지 방법이 있지만, 테이블을 수동으로 생성하고 데이터를 복사하는게 가장 쉽고 간단하다.


"테이블 스크립팅 > CREAT > 새 쿼리 편집창" 을 선택하면...


이렇게 쿼리를 만들어 준다.


원본 테이블 명을 생성할 테이블 명으로 바꾸어 주고 실행 하면...



이렇게 테이블 속성 까지 다 동일한 테이블이 만들어 진다.
물론 데이터는 없는 껍데기 테이블 이므로 데이터는 직접 넣어 줘야 한다.

이미 존재하는 테이블에 데이터를 넣어 주는 가장 간단한 쿼리는 이것이지만...

insert into [대상테이블]
selec * from [원본테이블]

이렇게 해보면... 이렇게 ...


막상 해보면 오류가 난다.
이것은 "intSeq" 컬럼이 "자동증가" 옵션이 지정되어 있기 때문이다.
만약  "자동증가" 옵션이 지정되어 있지 않는 테이블이었다면 정상적으로 실행되었을 것이다.

그러므로 대상 테이블에 있는 "자동증가" 옵션을 해제하고 데이터를 복사한 후 다시 "자동증가" 옵션을 지정해도 된다.
만약 그러기 귀찮다면....

set identity_insert [대상테이블] on

... 을 실행하면 ID 값을 넣을 수 있다 !!!
이렇게 해보면 !!!


...
... 쒯 ...
.
.
.

불행히도 "set identity_insert on" 을 사용할 때는, 컬럼명을 모두 지정해 줘야 한다.


이렇게.... 해주면...


이렇게 데이터가 잘 복사가 된다.

---------------------------------------------------------------------------------

참고로....


이렇게 "자동증가" 가 지정되어 있는 필드를 빼고 넣도록 쿼리를 실행하면  "set identity_insert on" 같은 옵션을 지정하지 않아도 데이터를 넣을 수 있는데... 이렇게 하면...
아무런 작업을 하지않은 테이블이라면 "자동증가값" 이 "1" 부터 시작하겠지만...
뭔가 작업을 했던 테이블을 초기화 한 경우라면, 이렇게 될 수도 있다.


즉, 대상 테이블이 이미 몇번 데이터를 넣었다가 값을 지웠다던지 했을 경우, 자동 증가값이 중간부터 시작하는 경우가 있다. 이것은 시스템이 해당 테이블의 자동증가값을 계속 기억하기 때문인데, 이것은 테이블의 데이터를 모두 지워도 없어지지 않는다.

다시 말해, 원본과 복사한 테이블의 "자동증가값" 이 동일 함을 보장 할 수 없다.

하지만, 만약 궂이 그 값들이 동일해야 할 필요가 없고, 단지 처음부터 시작하기만 해도 되는 경우라면....


그럴때는,

Truncate Table T_SCHEDULE_BACK
Dbcc Checkident(T_SCHEDULE_BACK, Reseed, 1)


... 를 지정해 주면 ....


이렇게 1 부터 시작하는 자동증가 값을 볼 수 있다.

참고로, "Truncate Table T_SCHEDULE_BACK" 는 테이블 데이터 삭제.
"Dbcc Checkident(T_SCHEDULE_BACK, Reseed, 1)" 는 아이디 값을 "1" 로 지정한다는 뜻이다.