본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL 테이블 복사 · CREATE TABLE SELECT 완전 정리

by 왕진 2026. 7. 14.
반응형

 

 

Web Development · MySQL

MySQL 테이블 복사 —
CREATE TABLE SELECT 완전 정리

CREATE TABLE ... SELECT · 구조만 복사 · 일부 컬럼 복사 · INSERT INTO ... SELECT
시작 오늘 분석할 코드
-- buytbl 전체 복사 (구조 + 데이터) CREATE TABLE buytbl2 (SELECT * FROM buytbl); SELECT * FROM buytbl2; -- 일부 컬럼만 복사 CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl); SELECT * FROM buytbl3;
CREATE TABLE ... SELECT는 테이블 구조 정의와 데이터 삽입을 한 문장으로 처리하는 편의 문법이다. 단, 원본의 PRIMARY KEY / AUTO_INCREMENT / FOREIGN KEY 제약은 복사되지 않는다.

1 CREATE TABLE ... SELECT 기본

가장 간단한 테이블 복사 방법이다. SELECT의 결과 구조와 데이터가 그대로 새 테이블이 된다.

-- 전체 복사 CREATE TABLE buytbl2 (SELECT * FROM buytbl); -- 확인 SELECT * FROM buytbl2; -- buytbl과 동일한 12개 행이 들어있음 -- 구조 확인 DESC buytbl2; -- num, userID, prodName, groupName, price, amount 컬럼 존재 -- 단, PRIMARY KEY/AUTO_INCREMENT는 사라짐
CREATE TABLE ... SELECT로 복사된 테이블에는 PRIMARY KEY, AUTO_INCREMENT, FOREIGN KEY가 사라진다. 제약 조건이 필요하면 복사 후 ALTER TABLE로 추가해야 한다.

2 일부 컬럼만 복사

SELECT에서 원하는 컬럼만 지정하면 그 컬럼만으로 새 테이블이 만들어진다. 데이터 분석용 임시 테이블을 만들 때 유용하다.

-- userID, prodName 두 컬럼만 복사 CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl); SELECT * FROM buytbl3; -- 결과: num/price/amount/groupName 없이 userID, prodName만 -- WHERE로 조건 필터 후 복사 CREATE TABLE buytbl_kbs (SELECT * FROM buytbl WHERE userID = 'KBS'); -- KBS 회원의 구매 기록만 새 테이블로 분리 -- AS로 컬럼명 바꿔서 복사 CREATE TABLE buytbl4 ( SELECT userID AS uid, prodName AS item, price*amount AS total FROM buytbl );
패턴 결과
SELECT * 모든 컬럼 복사
SELECT col1, col2 지정 컬럼만
SELECT * WHERE 조건 조건에 맞는 행만
SELECT col AS 이름 컬럼명 바꿔서 복사
SELECT col1*col2 AS 이름 계산식 결과를 컬럼으로

3 구조만 복사 (데이터 제외)

빈 테이블(같은 구조만)을 만들고 싶을 때 WHERE 1=0 꼼수를 쓴다. 1=0은 항상 FALSE라서 행이 하나도 복사되지 않는다.

-- 구조만 복사, 데이터 없음 CREATE TABLE buytbl_empty (SELECT * FROM buytbl WHERE 1=0); SELECT * FROM buytbl_empty; -- 결과: 컬럼은 있지만 행은 0개 -- MySQL 공식 방법: CREATE TABLE ... LIKE (구조 + 제약 포함) CREATE TABLE buytbl_like LIKE buytbl; -- PRIMARY KEY, INDEX 등 제약도 함께 복사됨 (데이터는 없음)
WHERE 1=0 방법

구조만 복사 (제약 없음)
SELECT * FROM ... WHERE 1=0

PRIMARY KEY/AUTO_INCREMENT 사라짐

LIKE 방법

구조 + 제약 모두 복사
CREATE TABLE 새이름 LIKE 원본

PRIMARY KEY, INDEX 유지됨

테스트 테이블을 만들 때는 LIKE가 더 안전하다 — 원본과 동일한 제약이 있어 INSERT 시 검증이 유지된다. WHERE 1=0은 제약이 없는 느슨한 복사본이 필요할 때 쓴다.

 

반응형

 

4 INSERT INTO ... SELECT — 기존 테이블에 복사

새 테이블이 아니라 이미 있는 테이블에 다른 테이블의 데이터를 넣을 때 사용한다. 마이그레이션, 아카이빙에 자주 쓰인다.

-- buytbl의 모든 데이터를 buytbl_backup에 넣기 INSERT INTO buytbl_backup SELECT * FROM buytbl; -- 특정 컬럼만 넣기 INSERT INTO prodname_log (uid, item) SELECT userID, prodName FROM buytbl; -- 조건 필터 후 넣기 INSERT INTO high_price_items SELECT * FROM buytbl WHERE price > 500;
방법 대상 특징
CREATE TABLE ... SELECT 새 테이블 생성 구조+데이터 한 번에. 제약 사라짐
CREATE TABLE ... LIKE 새 테이블 생성 구조+제약만. 데이터 없음
INSERT INTO ... SELECT 기존 테이블에 추가 테이블이 미리 있어야 함. 컬럼 타입 호환 필요

5 복사 후 제약 추가

CREATE TABLE ... SELECT로 만든 테이블은 제약이 없다. 필요하면 ALTER TABLE로 추가한다.

-- 복사 후 PRIMARY KEY 추가 CREATE TABLE buytbl2 (SELECT * FROM buytbl); ALTER TABLE buytbl2 ADD PRIMARY KEY (num), MODIFY num INT AUTO_INCREMENT; -- 구조 확인 DESC buytbl2; SHOW CREATE TABLE buytbl2;
데이터 마이그레이션 시 일반적인 흐름: ① CREATE TABLE 새이름 LIKE 원본 → ② INSERT INTO 새이름 SELECT * FROM 원본 WHERE 조건 → ③ 원본 삭제 or 아카이브

6 복사 방법 선택 가이드
상황 권장 방법 이유
빠르게 데이터 백업 CREATE TABLE ... LIKE + INSERT INTO 원본 제약 유지되어 안전
특정 조건 행만 분리 CREATE TABLE ... (SELECT ... WHERE 조건) 조건 필터 + 복사 한 번에
일부 컬럼만 새 테이블로 CREATE TABLE ... (SELECT col1, col2 ...) 필요한 컬럼만 선택 가능
기존 테이블에 데이터 추가 INSERT INTO 대상 SELECT * FROM 원본 테이블이 이미 있을 때
구조만 (빈 테이블) CREATE TABLE ... LIKE 원본 제약 포함해서 복사됨
집계 결과를 새 테이블로 CREATE TABLE ... (SELECT ... GROUP BY ...) 집계와 복사 한 번에
운영 DB에서 직접 작업하기 전에 반드시 복사본을 만들자 — 실수해도 원본 데이터는 안전하다.

7 자주 하는 실수
실수 증상 해결
복사 후 PK 없는 줄 모름 중복 삽입 허용, 참조 무결성 없음 DESC 또는 SHOW CREATE TABLE로 확인 후 ALTER TABLE
이미 있는 테이블에 CREATE Table already exists 오류 DROP TABLE IF EXISTS 후 재생성, 또는 INSERT INTO
INSERT INTO 컬럼 수 불일치 Column count doesn't match INSERT INTO 컬럼 목록과 SELECT 컬럼 수/순서 맞추기
WHERE 1=0이 아닌 WHERE 1=1 전체 행이 다 복사됨 구조만 원하면 WHERE 1=0 (항상 FALSE)
FK 있는 테이블 순서 위반 FK 오류 부모 테이블 먼저 복사, 자식 테이블은 그 다음

핵심 한 줄 요약

CREATE TABLE 새 (SELECT * FROM 원본)구조+데이터 통째로 복사 (제약 사라짐)
SELECT 컬럼1, 컬럼2원하는 컬럼만 골라서 새 테이블로
WHERE 조건조건에 맞는 행만 복사 (WHERE userID = 'KBS')
WHERE 1=0구조만, 데이터 없이 빈 테이블 생성 (항상 FALSE)
CREATE TABLE ... LIKE구조+제약 모두 복사, 데이터 없음 (추천)
INSERT INTO ... SELECT기존 테이블에 다른 테이블의 행 추가
PRIMARY KEY 사라짐CREATE ... SELECT 후 반드시 DESC로 제약 확인
ALTER TABLE ADD PRIMARY KEY복사 후 제약 추가 — MODIFY로 AUTO_INCREMENT 복원
마이그레이션 순서LIKE로 구조 생성 → INSERT INTO SELECT로 데이터 이동
DROP TABLE IF EXISTS이미 있는 테이블에 재생성 전 안전하게 삭제
AS로 컬럼명 변경SELECT col AS 새이름 → 새 테이블의 컬럼명이 바뀜
계산식 컬럼SELECT price*amount AS total → total 컬럼으로 복사
RENAME TABLE테이블 이름 변경 — RENAME TABLE old_name TO new_name
테이블 복사 vs 백업운영 테이블은 건드리지 않고 복사본에서 작업하는 안전 패턴
SELECT * 복사 주의원본에 컬럼 추가 시 복사 테이블은 업데이트 안 됨 — 별개 테이블
빈 테이블 확인SELECT COUNT(*) FROM 테이블 → 0이면 데이터 없는 빈 테이블
TRUNCATE vs DELETETRUNCATE = 전체 삭제(빠름/AUTO_INCREMENT 리셋), DELETE = 행 단위
복사 후 검증원본 COUNT(*) = 복사본 COUNT(*) 비교로 완전 복사 확인
INDEX 복사CREATE TABLE SELECT는 INDEX도 사라짐 — LIKE는 INDEX 포함
GROUP BY 결과 복사CREATE TABLE 집계결과 (SELECT userID, SUM(...) FROM ... GROUP BY ...)
SHOW TABLES현재 DB의 모든 테이블 목록 — 복사 전후로 확인
SELECT * 결과 검증CREATE 후 SELECT * 로 데이터가 맞는지 즉시 눈으로 확인
복사 목적 구분테스트=LIKE, 백업=LIKE+INSERT, 분석=CREATE+SELECT, 이관=INSERT INTO
ORDER BY 포함 복사CREATE TABLE 정렬결과 (SELECT ... ORDER BY price DESC) — 순서대로 삽입
다른 DB 복사CREATE TABLE newdb.tbl (SELECT * FROM olddb.tbl) — DB 간 복사 가능
DESCRIBE 확인복사 후 DESCRIBE 테이블명 으로 컬럼 타입, 제약 확인 필수
임시 테이블CREATE TEMPORARY TABLE = 세션 종료 시 자동 삭제되는 임시 테이블
테이블명 규칙백업용: buytbl_20260625, 테스트용: buytbl_test, 마이그용: buytbl_new
ON DUPLICATE KEYINSERT INTO ... ON DUPLICATE KEY UPDATE = 존재하면 UPDATE, 없으면 INSERT
INSERT IGNOREPK 중복 시 오류 대신 건너뜀 — 대량 복사 때 활용
REPLACE INTOPK 충돌 시 기존 삭제 후 새로 삽입 — ON DUPLICATE UPDATE와 차이
복사 + WHERE ORDERCREATE TABLE top3 (SELECT ... ORDER BY price DESC LIMIT 3)
컬럼 타입 보존SELECT * FROM은 원본 컬럼 타입 그대로 복사됨
복사 시 주의사항UNIQUE INDEX 없으므로 중복 허용 — 원본과 달리 동일값 여러 개 가능
테이블 존재 확인CREATE TABLE IF NOT EXISTS = 없을 때만 생성 (중복 오류 방지)
대용량 복사 팁대용량 INSERT INTO SELECT는 트랜잭션 분리해서 commit_size 조절
WHERE 1=2WHERE 1=0과 동일, 항상 FALSE → 빈 테이블 생성
ALTER TABLE RENAMEALTER TABLE buytbl RENAME TO buytbl_backup — 테이블명 변경
mysqldump 백업SQL 파일로 전체 DB 백업 — CREATE TABLE SELECT보다 완전한 백업
복사 검증SELECT COUNT(*) 원본 vs 복사본 비교로 완전 복사 여부 확인
DELETE 후 INSERT기존 테이블 내용 교체 — TRUNCATE + INSERT INTO SELECT
SELECT 서브쿼리 복사CREATE TABLE t (SELECT ...) — SELECT 결과가 새 테이블 구조+데이터
테이블 이중화 패턴원본은 Read-only, 복사본에서 변환 작업 후 교체 → 롤백 가능
복사 후 DROP 원본마이그레이션 완료 후 원본 삭제 — DROP TABLE old_table
WHERE ORDER LIMIT 복사CREATE TABLE top5 (SELECT ... ORDER BY price DESC LIMIT 5)
복사 시 DEFAULT 유지컬럼 DEFAULT 값은 복사됨, AUTO_INCREMENT 시작값만 사라짐

Tags

#MySQL #CREATE TABLE SELECT #테이블복사 #INSERT INTO SELECT #구조복사 #LIKE #SQL #데이터베이스 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, CREATE TABLE SELECT, 테이블복사, INSERT INTO SELECT, 구조복사, LIKE, SQL, 데이터베이스, 웹개발, 티스토리
반응형

댓글