본문 바로가기

SQL

DB 테이블 모든 데이터 한번에 삭제하는 방법, Truncate vs Delete

반응형

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
반응형