들어가며

간혹 SQL 성능 테스트를 하다보면 기존 Table 을 유지한 상태로, 제약조건 하나만 더 추가한 새로운 테이블을 만들어서 테스트해보고 싶을 때가 있습니다. 따라서 해당 포스팅에서는 기존 테이블을 복사하는 2가지 방법을 소개하고자 합니다.

기존 테이블

우선, 복사하고자하는 테이블의 row 수는 총 400만개입니다.

SELECT COUNT(id) from crew_participant;  

또한, 복사하고자하는 테이블을 구조는 아래와 같습니다. PKAUTO_INCREMENT. 그리고 crew_id, member_id, member_id, request_at 컬럼에는 NOT NULL 제약조건이 걸려있는 것을 확인할 수 있습니다.

SHOW CREATE TABLE crew_participant;

테이블 복사

복사 방법 1

테이블 자체를 복사하는 첫번째 방법은 CREATE TABLE 새로운_테이블명 AS SELECT * FROM 복사할 테이블명 을 사용하는 것입니다. 하지만 해당 방법은 NOT NULL Constriant 제외한 나머지 Constraint(Index, PK, FK, CHECK 등)은 복사되지 않습니다. 해당 방법은 복사된 테이블에 새롭게 제약조건을 추가하고싶을때 사용하면 좋을 것 같습니다.

CREATE TABLE shallow_copy_crew_participant AS  
SELECT  
    *  
FROM  
    crew_participant;

새롭게 만든 shallow_copy_crew_participant 테이블의 총 row 개수가 400 만개. 즉, 정상적으로 복사된 것을 알 수 있습니다.

SELECT COUNT(id) from shallow_copy_crew_participant;

복사한 shallow_copy_crew_participant 을 보면 NOT NULL 을 제외한 나머지 제약조건이 복사되지 않은 것을 확인할 수 있습니다.

SHOW CREATE TABLE shallow_copy_crew_participant;

테이블 구조만 복사

복사하는 테이블의 제약조건을 따르지 않고, 내용들(row) 들도 복사하고 싶지 않을 떄가 있습니다. 그럴때는 CREATE TABLE 새로운_테이블명 AS SELECT * FROM 복사할 테이블명 에서 무조건 False 로 만드는 Where 절을 명시해주면 됩니다.

CREATE TABLE shallow_copy_crew_participant_2 AS  
SELECT  
    *  
FROM  
    crew_participant
WHERE 
	 1 = 0;

새롭게 만들어진 shallow_copy_crew_participant_2 에는 crew_participant 의 row 들이 복사되지 않을 것을 확인할 수 있습니다.

SELECT COUNT(id) from shallow_copy_crew_participant_2;  

당연히 NOT NULL 을 제외한 나머지 제약조건이 복사되지 않은 것도 확인할 수 있습니다.

SHOW CREATE TABLE shallow_copy_crew_participant_2;

복사 방법 2

테이블 자체를 복사하는 두번째 방법은 CREATE TABLE 새로운_테이블명 LIKE 복사할_테이블명 로 테이블 구조를 먼저 복사한 다음, INSERT INTO 새로운_테이블명 SELECT * FROM 복사할_테이블명 로 데이터를 삽입하는 방식입니다. 해당 방법은 모든 제약조건(Index, PK, FK, CHECK 등)을 복사하게 됩니다.

CREATE TABLE deep_copy_crew_participant LIKE crew_participant;  
INSERT INTO  
    deep_copy_crew_participant  
SELECT  
    *  
FROM  
    crew_participant;

새롭게 만들어진 deep_copy_crew_participant 에는 crew_participant 의 모든 row 가 복사된 것을 확인할 수 있습니다.

SELECT COUNT(id) FROM deep_copy_crew_participant;  

또한, crew_participant 의 모든 제약조건도 복사된것도 확인할 수 있습니다.

SHOW CREATE TABLE deep_copy_crew_participant;

마치며

이상으로 테이블을 복사하는 2가지 방법을 알아보았습니다. 정리하면 아래와 같습니다.

  • CREATE TABLE 새로운_테이블명 AS SELECT * FROM 복사할 테이블명 는 NOT NULL Constriant 제외한 나머지 Constraint(Index, PK, FK, CHECK 등) 은 복사되지 않습니다.
  • CREATE TABLE 새로운_테이블명 LIKE 복사할_테이블명 는 모든 Constraint 를 복사합니다.