MySQL에서 TRUNCATE는 테이블 구조를 데이터베이스에 그대로 남겨둔 채 모든 행(row)을 제거하는 명령입니다. DELETE 명령 역시 테이블의 모든 행을 삭제할 수 있기 때문에 겉보기에는 같은 작업을 하는 것처럼 보입니다. 하지만 두 명령 사이에는 PRIMARY KEY AUTO_INCREMENT 값의 재초기화 여부라는 중요한 차이점이 존재합니다.
컬럼이 PRIMARY KEY 제약 조건과 함께 AUTO_INCREMENT로 정의되어 있다면, DELETE 명령으로 모든 행을 삭제하더라도 테이블은 재초기화되지 않습니다. 즉, 이후 새로운 행을 삽입하면 AUTO_INCREMENT 번호는 마지막으로 삽입된 행의 다음 번호부터 이어집니다. 반면 TRUNCATE를 사용하면 테이블이 마치 새로 생성된 것처럼 완전히 초기화되므로, 실행 후 새 행을 삽입하면 AUTO_INCREMENT 번호가 1부터 다시 시작됩니다.
예제로 확인하기
다음 예제를 통해 두 명령의 차이를 단계별로 살펴보겠습니다.
1단계: 테이블 생성 및 데이터 삽입
mysql> CREATE TABLE testing(Id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, Name VARCHAR(20));
Query OK, 0 rows affected (0.15 sec)
mysql> INSERT INTO testing(Name) VALUES('Gaurav'),('Rahul'),('Aarav'),('Yashraj'),('Manak');
Query OK, 5 rows affected (0.09 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Gaurav |
| 2 | Rahul |
| 3 | Aarav |
| 4 | Yashraj |
| 5 | Manak |
+----+---------+
5 rows in set (0.00 sec)
2단계: DELETE로 행 삭제 후 새 행 삽입
mysql> DELETE FROM testing WHERE id >= 4;
Query OK, 2 rows affected (0.04 sec)
mysql> INSERT INTO testing(Name) VALUES('Harshit'),('Lovkesh');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Gaurav |
| 2 | Rahul |
| 3 | Aarav |
| 6 | Harshit |
| 7 | Lovkesh |
+----+---------+
5 rows in set (0.00 sec)
DELETE로 id 4, 5번 행을 삭제한 뒤 새 행을 삽입하자, AUTO_INCREMENT 값이 1부터 시작하지 않고 기존 시퀀스를 이어받아 6, 7부터 할당된 것을 확인할 수 있습니다.
3단계: TRUNCATE 실행 후 새 행 삽입
mysql> TRUNCATE TABLE testing;
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO testing(Name) VALUES('Harshit'),('Lovkesh'),('Ram'),('Gaurav');
Query OK, 4 rows affected (0.11 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Harshit |
| 2 | Lovkesh |
| 3 | Ram |
| 4 | Gaurav |
+----+---------+
4 rows in set (0.00 sec)
반면 TRUNCATE 실행 후에는 테이블이 완전히 초기화되어, 새로 삽입된 행들의 AUTO_INCREMENT 값이 1부터 다시 매겨지는 것을 볼 수 있습니다.
TRUNCATE와 DELETE의 주요 차이점 정리
- AUTO_INCREMENT 초기화: DELETE는 카운터 값을 유지하고, TRUNCATE는 1부터 다시 시작합니다.
- 조건부 삭제: DELETE는 WHERE 절로 특정 행만 삭제할 수 있지만, TRUNCATE는 항상 전체 행을 삭제합니다.
- 실행 속도: TRUNCATE는 테이블을 통째로 재구성하는 방식이라 DELETE보다 훨씬 빠릅니다.
- 트리거 동작: DELETE는 삭제 트리거를 활성화하지만, TRUNCATE는 트리거를 호출하지 않습니다.
- 트랜잭션: DELETE는 롤백이 가능하지만, TRUNCATE는 DDL에 해당하여 MySQL에서 암묵적으로 커밋되므로 롤백할 수 없습니다.