본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로데이터 › 데이터베이스 › SQL

테이블 복사(Table Copy)

목차

테이블 복사(Table Copy)

테이블 복사는 구조만 필요한지, 구조와 데이터가 모두 필요한지, 이미 만든 테이블에 행만 추가할지에 따라 명령이 달라진다. 원래 메모의 네 경우를 MySQL 예제로 정리해 본다. 여기서는 users(user_id, name, status)라는 원본 테이블이 있다고 가정한다. '테이블명'처럼 작은따옴표를 쓰면 문자열을 뜻하므로 식별자 자리에 그대로 넣지 않는다.

목적MySQL 예시데이터 복사
구조만 복사CREATE TABLE members LIKE users안 함
조회 결과로 새 테이블 생성CREATE TABLE members AS SELECT ... FROM users함
기존 테이블에 행 추가INSERT INTO members (...) SELECT ... FROM users함

1. 구조만 복사

CREATE TABLE members LIKE users;

MySQL의 LIKE는 원본의 컬럼 속성과 인덱스를 바탕으로 빈 테이블을 만든다. 다만 외래 키 정의는 복사하지 않는다. 구조가 완전히 동일한 백업이라고 가정하기 전에 SHOW CREATE TABLE members;로 확인한다. MySQL CREATE TABLE ... LIKE 문서에 복사되는 속성과 제외되는 속성이 적혀 있다.

원래 메모의 Oracle 예시처럼 WHERE 1=2로 0행을 선택하면 데이터 없이 조회 결과의 컬럼으로 테이블을 만들 수 있다. 이 방법은 MySQL에서도 쓸 수 있지만 LIKE와 동일하게 제약 조건·인덱스를 복제한다는 뜻은 아니다.

CREATE TABLE members AS
SELECT user_id, name, status FROM users WHERE 1 = 2;

2. 구조와 내용 복사

CREATE TABLE members AS
SELECT user_id, name, status
FROM users;

CREATE TABLE ... AS SELECT는 조회 결과로 새 테이블과 행을 만든다. 필요한 컬럼과 조건을 선택할 수 있다는 장점이 있지만, 기본 키·인덱스·외래 키 같은 제약이 원본 그대로 생기는지 DBMS별로 확인해야 한다. 예를 들어 이 방식으로 만든 members를 운영 테이블로 쓸 계획이라면 제약과 인덱스를 별도로 검토한다. MySQL CREATE TABLE ... SELECT 문서를 참고한다.

3. 이미 있는 테이블에 행만 복사

INSERT INTO members (user_id, name, status)
SELECT user_id, name, status
FROM users;

SELECT *는 두 테이블의 컬럼 순서가 바뀌었을 때 의도와 다르게 들어갈 수 있다. 따라서 대상과 원본의 컬럼을 명시하는 편이 안전하다. 기존 테이블의 기본 키나 유일성 제약을 위반하는 행이 있으면 삽입이 실패할 수 있다.

4. 조건에 맞는 행만 복사

INSERT INTO members (user_id, name, status)
SELECT user_id, name, status
FROM users
WHERE status = 'active';

원래 메모의 FROM FROM USER는 FROM이 두 번 나온 오타다. 범위를 정하기 전에 같은 SELECT만 먼저 실행해 복사할 행을 확인한다. 데이터 복사는 원본을 자동으로 삭제하지 않으며, 백업·복제·이관 중 어떤 목적이든 필요한 제약과 복구 방법까지 확인해야 작업을 마칠 수 있다.

복사 뒤 반드시 비교할 것

복사 명령이 성공해도 새 테이블이 원본의 완전한 백업이라는 뜻은 아니다. CREATE TABLE ... AS SELECT는 조회 결과를 재료로 만들기 때문에 기본 키, 인덱스, 외래 키, 트리거, 권한 등이 원본과 다를 수 있다. CREATE TABLE ... LIKE도 DBMS와 버전마다 복제 범위가 다르다. 따라서 목적이 조회 실습용 사본인지 운영 복구용 백업인지 먼저 정한다. 운영 복구용이라면 DBMS의 백업·복원 도구와 일관된 시점의 스냅샷을 사용한다.

-- MySQL에서 구조와 행 수를 각각 확인
SHOW CREATE TABLE users;
SHOW CREATE TABLE members;
SELECT COUNT(*) AS source_count FROM users;
SELECT COUNT(*) AS copied_count FROM members;

행 수가 같아도 특정 컬럼이 빠졌거나 타입이 바뀌었을 수 있다. SHOW CREATE TABLE에서 제약과 인덱스를 비교하고, 중요 데이터는 대표 행 또는 체크섬을 별도로 검증한다. INSERT INTO members ... SELECT를 반복하면 같은 행이 두 번 들어가거나 기본 키 오류가 날 수 있다. 재실행 가능한 이관이라면 대상의 고유 키와 충돌 처리, 처리한 범위를 설계한다.

복사 중 원본 테이블에 쓰기가 계속 일어나면 시작 시점과 종료 시점의 행 집합이 다를 수 있다. 필요한 일관성 수준에 따라 트랜잭션 격리, 쓰기 중단 시간 또는 DBMS의 스냅샷 기능을 선택한다. 대량 복사는 잠금·로그·디스크 공간을 사용하므로 운영 서버에서 처음 실행할 때는 작은 범위로 검증하고 리소스 사용량을 관찰한다.

실패점검
새 테이블이 예상보다 적은 열을 가짐SELECT의 컬럼 목록과 SHOW CREATE TABLE
삽입 시 중복 키 오류기존 행, PK/UNIQUE, 재실행 여부
복사 중 서비스 지연대량 쓰기·로그·디스크와 잠금
복원에 필요한 제약이 없음AS SELECT와 백업의 차이

참고: MySQL CREATE TABLE ... LIKE, CREATE TABLE ... SELECT.

같은 카테고리의 글