기술블로그

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팁