본문 바로가기

MS-SQL

MSSQL 데이터 복사, 테이블 복사 SELECT INTO, INSERT SELECT를 이용한 백업

MSSQL 테이블 복사하는 여러가지 방법에 대해 알아보도록 하겠습니다. DB작업시 전체백업을 항상 꼼꼼하게 한 뒤에 작업해야 겠지만, 한 두개의 테이블에 UPDATE, DELETE 작업을 할 때 예상치 못한 만일의 사태에 대비하기 위해서 또는 긴급하게 데이터를 원복하기 위해 개별 테이블 단위의 백업도 자주하게 됩니다. 이번 글에서는 SELECT INTO, INSERT SELECT 구문을 활용한 데이터복사와 테이블복사, JOIN을 활용한 데이터복사 및 조건절을 통한 필터링에 대해 알아보겠습니다. 아래의 테이블 카피 구문을 사용하면 간단한 쿼리로 신속하게 데이터를 백업하고 유사시 쉽게 원복할 수 있습니다.


예제로 사용할 테이블은 다음과 같습니다.


Fruit

 Seq

Name

 Flavor

 Rank

 1 

 딸기

 새콤하다 

 1

 2

 바나나

 달콤하다 2

 3

 사과

 향긋하다

 3


FruitSimple

Seq

Name

  


MonthlySales

Name

 Month

 Rank

 딸기

 9월 3

 바나나

 9월 1

 사과

 9월

 2


상황1. [Fruit] 테이블을 카피해 [Fruit_180101] 을 생성하고 데이터도 모두 카피하고 싶다.

SELECT * INTO Fruit_180101 FROM Fruit --테이블 자동생성하고, 데이터 모두 카피
SELECT * INTO Fruit_180101 FROM Fruit WHERE 1=2 --테이블 자동생성하고, 조건 1=2는 항상 false이므로 데이터는 카피되지 않음
SELECT * INTO Fruit_180101 FROM Fruit WHERE Seq < 3 --테이블 자동생성하고, Seq < 3인 데이터만 카피

결과1)

테이블 복사 및 데이터 모두카피 결과테이블 복사 및 데이터 모두카피 결과 


결과2)

테이블만 카피한 결과테이블만 카피한 결과


결과3)

테이블 카피하고 조건에 맞는 데이터만 카피테이블 카피하고 조건에 맞는 데이터만 카피



SELECT INTO 문은 테이블을 새로 생성하면서 데이터를 카피할 때 사용합니다. 물론 WHERE 조건절도 사용가능합니다. 

주의) 키, 인덱스 등은 동일하게 생성되지 않음.


상황2. [Fruit] 테이블의 데이터를 [FruitSimple] 테이블에 데이터만 카피하고 싶다.

INSERT INTO Fruit_180101 SELECT * FROM Fruit --SELECT의 결과를 스키마가 같은 이미 존재하는 다른 테이블에 카피
INSERT INTO FruitSimple(Seq, Name) SELECT Seq, Name FROM Fruit --필드를 지정해서 카피가능
INSERT INTO FruitSimple(Seq, Name) SELECT Seq, Name FROM Fruit WHERE Seq <3 --조건절 사용 가능

결과1

SELECT의 결과를 스키마가 같은 이미 존재하는 다른 테이블에 카피SELECT의 결과를 스키마가 같은 이미 존재하는 다른 테이블에 카피


결과2

특정 필드만 카피정 필드만 카피


결과3

조건절 사용하여 테이터만 카피한 결과조건절 사용하여 테이터만 카피한 결과


INSERT INTO SELECT문은 SELECT문의 결과 데이터를 다른테이블에 카피할 때 사용합니다. 일반적인 INSERT INTO문 처럼 특정필드만 지정 가능합니다. 


응용1. [Fruit], [MonthlySales]두 테이블의 조인의 결과를 카피해 [FruitMonth_180101] 테이블을 생성하고 데이터도 모두 카피하고 싶다.

SELECT FR.Seq, FR.Name, MS.Month 
INTO FruitMonth_180101
FROM Fruit FR
INNER JOIN MonthlySales MS
    ON FR.Name = MS.Name

결과1


응용2. Fruit, MonthlySales두 테이블의 조인의 결과를 FruitSimple 테이블에 일부 필드 데이터만 카피하고 싶다.

INSERT INTO FruitSimple(Seq, Name) 
SELECT FR.Seq, MS.Name 
FROM Fruit FR
INNER JOIN MonthlySales MS
    ON FR.Name = MS.Name

결과1

INSERT INNER JOIN두 테이블의 조인의 결과를 다른 테이블에 일부 필드 데이터만 카피하고 싶다.


프로젝트의 성공을 기원합니다.