목차
테이블 복사(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와 백업의 차이 |