1. TRUNCATE 문이란?
TRUNCATE 문의 기본 개념
MySQL에서 TRUNCATE 문은 테이블의 모든 데이터를 한 번에 제거하는 명령어입니다. 행을 하나씩 삭제하는 DELETE 문과 달리, TRUNCATE는 내부적으로 테이블을 재생성하여 데이터를 비웁니다. 따라서 대량의 데이터를 효율적으로 삭제하는 데 매우 효과적입니다.
기본 구문
TRUNCATE 문의 기본 구문은 다음과 같습니다:
TRUNCATE TABLE table_name;
이 구문은 지정된 테이블의 모든 행을 제거하고 테이블을 초기 상태로 재설정합니다. 하지만 삭제된 데이터는 복구할 수 없으므로 이 명령을 사용할 때는 주의가 필요합니다.
예시: 기본 사용법
아래 예시에서는 users 테이블을 생성한 뒤 TRUNCATE 문으로 비웁니다:
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- Execute TRUNCATE
TRUNCATE TABLE users;
-- The table is emptied, and AUTO_INCREMENT is reset.
이 예시에서는 테이블의 모든 데이터가 삭제되고, 새 데이터를 삽입하면 id 컬럼이 다시 1부터 시작합니다.

2. TRUNCATE와 DELETE의 차이점
속도 및 성능 차이
TRUNCATE는 전체 테이블을 비우도록 설계되었기 때문에 DELETE보다 훨씬 빠릅니다. DELETE을 하나씩 삭제하므로 많은 행을 처리할 때 속도가 느려질 수 있습니다. 반면 TRUNCATE는 테이블을 내부적으로 재생성하여 데이터를 삭제하므로 대량 삭제에 매우 효율적입니다.
예시: 성능 비교
수백만 행을 삭제할 때 DELETE 문은 다음과 같이 보일 수 있습니다:
DELETE FROM users WHERE condition;
이에 비해 TRUNCATE는 한 번에 모든 행을할 수 있습니다:
TRUNCATE TABLE users;
매우 큰 테이블에서는 성능 차이가 더욱 뚜렷해집니다—DELETE는 상당한 시간이 걸릴 수 있지만 TRUNCATE는 거의 즉시 완료됩니다.
롤백 차이점
TRUNCATE 문은 롤백할 수 없습니다. 실행된 순간 데이터는 영구적으로 삭제되어 복구할 수 없습니다. 반면 DELETE는 트랜잭션 내에서 사용하면 롤백이 가능하므로 오류 발생 시 복구가 가능합니다. 따라서 특정 상황에서는 DELETE가 더 안전합니다.
선택적 삭제 차이점
DELETE 문은 WHERE 절을 사용해 특정 조건에 맞는 행만 삭제할 수 있지만, TRUNCATE는 선택적 삭제를 지원하지 않습니다. 예를 들어 특정 사용자를 하나만 삭제하려면 DELETE를 사용합니다:
DELETE FROM users WHERE id = 1;
TRUNCATE는 항상 모든 행을 삭제하므로, 선택된 데이터만 제거하고 싶을 때는 DELETE가 더 적합합니다.
3. TRUNCATE가 AUTO_INCREMENT에 미치는 영향
AUTO_INCREMENT 초기화
TRUNCATE를 실행하면 테이블 데이터가 모두 삭제될 뿐만 아니라 AUTO_INCREMENT 카운터도 초기화됩니다. 즉, 새 데이터는 ID 1부터 다시 시작합니다. 예를 들어 TRUNCATE 후 users 테이블에 데이터를 삽입하면:
INSERT INTO users (name) VALUES ('Ken');
-- id will start again from 1
이 초기화는 경우에 따라 유용할 수 있지만, 다른 테이블에서 ID를 외래 키로 사용하고 있다면 예기치 않은 불일치가 발생할 수 있으니 주의가 필요합니다.
4. TRUNCATE 사용 시 주의사항
데이터 복구 불가
TRUNCATE의 가장 큰 위험은 삭제된 데이터가 복구될 수 없다는 점입니다. 중요한 데이터를 실수로 TRUNCATE하면 영구적인 손실이 발생합니다. TRUNCATE를 실행하기 전에 항상 데이터를 백업하십시오.
외래 키 제약
TRUNCATE는 외래 키 제약이 있는 테이블에서는 사용할 수 없습니다. 이 경우 먼저 제약을 제거하거나 다른 방법으로 관련 데이터를 처리해야 합니다.
권한 요구사항
TRUNCATE를 실행하려면 해당 테이블에 DROP 권한이 있어야 합니다. 권한이 충분하지 않은 사용자는 이 명령을 실행할 수 없으므로, 사전에 권한을 확인하십시오.

5. TRUNCATE와 DELETE를 언제 사용할까
TRUNCATE를 사용할 때
TRUNCATE는 전체 테이블을 한 번에 비워야 할 때 가장 적합합니다. 테스트 데이터를 새로 고칠 때와 같이 모든 행을 빠르게 제거하고 AUTO_INCREMENT를 재설정해야 할 경우 특히 유용합니다.
DELETE를 사용해야 할 때
DELETE는 선택적인 행 제거가 필요하거나 트리거가 실행되어야 할 때 사용해야 합니다. 특정 조건 하에서 데이터를 안전하게 제거하면서 데이터베이스 일관성을 유지하고자 할 때 더 적합합니다.
6. TRUNCATE를 안전하게 사용하기 위한 모범 사례
백업의 중요성
TRUNCATE를 실행하기 전에 항상 데이터 백업을 생성하십시오. 실수로 실행하여 발생하는 데이터 손실은 복구할 수 없으므로, 운영 환경에서는 특별한 주의가 필요합니다.
개발 환경에서 테스트하기
운영 환경에서 사용하기 전에 스테이징 또는 개발 환경에서 TRUNCATE를 항상 테스트하십시오. 이렇게 하면 예상대로 동작하는지 확인하고 예기치 않은 문제를 방지할 수 있습니다.
AUTO_INCREMENT 컬럼 관리
TRUNCATE는 AUTO_INCREMENT를 재설정하므로, 고유 ID와 다른 테이블과의 관계가 방해받지 않는지 확인하십시오. 중요한 시스템에서 TRUNCATE를 실행하기 전에 항상 백업하고 종속성을 검토하십시오.


