기술블로그
MySQL TRUNCATE vs DELETE 차이점 정리
Chansman
2025. 4. 25. 01:36
MySQL TRUNCATE vs DELETE 차이점 정리
프로젝트를 진행하면서 AUTO_INCREMENT 초기화 문제로 여러 번 혼란을 겪었습니다. 특히 테이블 데이터를 삭제할 때 TRUNCATE와 DELETE의 차이를 명확히 이해하는 것이 중요하다는 걸 깨달았습니다.
이 글에서는 오늘 발생한 이슈를 바탕으로 개념을 정리해보겠습니다.
🔹 1. TRUNCATE와 DELETE의 차이
구분 TRUNCATE DELETE
기본 기능 | 테이블의 모든 데이터 삭제 + 초기화 | 조건에 맞는 데이터 삭제 |
속도 | 빠름 (테이블 초기화 수준) | 느림 (한 행씩 삭제) |
AUTO_INCREMENT | 초기화됨 (1부터 시작) | 증가값 유지 |
롤백 | 불가 (일부 DB만 지원) | 트랜잭션 사용 시 가능 |
제약조건 | Foreign Key 있을 경우 제한 | 제약조건 준수 |
🔹 2. 오늘 발생한 주요 이슈
✅ 현상
- choices 테이블에 선택지를 여러 번 등록/삭제하는 과정에서
- ID가 1, 2, 3, 4가 아닌 5, 6, 7, 8부터 시작되는 현상 발생
🚨 원인
- DELETE FROM choices 로 데이터만 삭제했기 때문!
- MySQL은 DELETE 시 AUTO_INCREMENT를 초기화하지 않음
🔹 3. 해결 방법
1️⃣ AUTO_INCREMENT를 초기화하려면?
TRUNCATE TABLE choices;
- 이렇게 하면 데이터 삭제 + ID가 1부터 다시 시작!
2️⃣ 만약 DELETE 후 ID만 초기화하고 싶다면?
DELETE FROM choices;
ALTER TABLE choices AUTO_INCREMENT = 1;
- 주의: 테이블이 비어있을 때만 안전하게 사용 가능!
🔹 4. 실전 사용 팁
- 테스트 데이터 초기화 시 ➔ TRUNCATE 권장
- 실서비스 데이터 관리 시 ➔ 절대 TRUNCATE 사용 금지!
- Foreign Key 제약조건이 있을 경우:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE answers;
TRUNCATE TABLE choices;
SET FOREIGN_KEY_CHECKS = 1;
🔹 5. 요약
상황 추천 방법
테스트 데이터 전체 초기화 | TRUNCATE |
특정 조건 데이터만 삭제 | DELETE WHERE 조건 |
AUTO_INCREMENT 강제 리셋 | ALTER TABLE ... |
다음부터 비슷한 상황이 생기면, 이 기준으로 빠르게 대응할 수 있을 것 같습니다!
기억할 것!
단순 삭제는 DELETE, 완전 초기화는 TRUNCATE!
#MySQL #TRUNCATE #DELETE #AUTO_INCREMENT #DB팁