반응형

DB 테이블의 데이터를 삭제할 때 DELETE만 사용했는데 TRUNCATE 라는 DDL도 존재한다는 것을 알게 되었다.
TRUNCATE TABLE [테이블명];
이 명령어를 실행하면 'DELETE FROM [테이블명]' 과 동일하게 테이블의 모든 데이터가 한번에 삭제되는 것을 확인할 수 있다.
DELETE 문과는 몇 가지 차이점이 존재하는데 다음과 같다.
☑️ TRUNCATE vs DELETE
| TRUNCATE | DELETE | |
| 실행 속도 | 매우 빠름 (페이지 단위로 날림) | 상대적으로 느림 (행 단위 삭제) |
| 로그 기록 | 최소 로그 기록 (데이터 전체 삭제만 기록) | 모든 행 삭제가 로그로 기록 |
| WHERE 사용 | ❌ 불가능 (조건 삭제 안 됨) | ✅ 가능 (조건 삭제 가능) |
| 트리거 실행 | ❌ 안 됨 | ✅ 됨 |
| IDENTITY 초기화 | ✅ 다시 1부터 시작 (IDENTITY 초기화) | ❌ 유지 (모든 행 삭제해도 IDENTITY 증가) |
| 롤백 | ✅ 가능 (트랜잭션 안에서 실행 시) | ✅ 가능 |
| 권한 | ALTER 권한 필요 | DELETE 권한만 있으면 가능 |
DBMS별 차이
☑️ MSSQL
- TRUNCATE 하면 IDENTITY 컬럼 값 초기화 (다시 1부터 시작)
- 외래키(FK) 제약이 걸린 테이블에는 직접 TRUNCATE 불가
- 최소 로그만 기록
☑️ MySQL (InnoDB 기준)
- TRUNCATE는 내부적으로 DROP TABLE 후 다시 CREATE TABLE 하는 방식
- 그래서 AUTO_INCREMENT 값도 초기화됨
- 외래키가 있으면 TRUNCATE 불가능
☑️ Oracle
- TRUNCATE TABLE 테이블명;
- COMMIT이 자동으로 실행됨 → 롤백 불가 (중요 차이점)
- SEQUENCE는 초기화되지 않음 (Oracle은 IDENTITY 대신 SEQUENCE를 주로 씀)
☑️ PostgreSQL
- 빠른 전체 삭제 가능
- 기본키 시퀀스(SERIAL, BIGSERIAL)는 RESTART IDENTITY 옵션을 주면 초기화 가능
TRUNCATE TABLE users RESTART IDENTITY;
※ 실무에서 데이터를 삭제할 때는 정말 조심해야 하고 이렇게 모든 데이터를 삭제해야 할 일은 드물기에 TRUNCATE를 사용할 일은 거의 없지만 이런 방법도 있다는 것을 알게 되어 정리해 보았다.
728x90
반응형