반응형
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, 데이터베이스, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| MySQL HAVING — GROUP BY 결과 필터링 완전 정리 (0) | 2026.07.14 |
|---|---|
| MySQL MIN · MAX — 최솟값·최댓값 완전 정리 (0) | 2026.07.14 |
| MySQL 서브쿼리 · ANY · ALL · IN 완전 정리 (0) | 2026.07.14 |
| MySQL GROUP BY · 집계함수 · AS 완전 정리 (0) | 2026.07.14 |
| MySQL ORDER BY · DISTINCT · LIMIT 완전 정리 (0) | 2026.07.14 |
왕진 블로그

댓글