Database

[MySQL/MariaDB] DELETE / TRUNCATE

비번변경 2021. 10. 15. 13:55

DELETE, TRUNCATE는 두 개 모두 테이블 내용을 삭제하는 쿼리이다. 하지만 둘이 완전히 같은 기능을 하는 것은 아니다. 두 쿼리의 특징을 적어둔다.

 

DELETE

DML(Data Manipulation Language, 데이터 조작 언어) 중 하나

[ WITH <common_table_expression> [ ,...n ] ]
DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { <object> | rowset_function_limited  [ WITH ( <table_hint_limited> [ ...n ] ) ] }
    [ <OUTPUT Clause> ]
    [ FROM <table_source> [ ,...n ] ]
    [ WHERE { <search_condition> | { [ CURRENT OF  { [ GLOBAL ] cursor_name }  | cursor_variable_name } ] } } ]
    [ OPTION ( <Query Hint> [ ,...n ] ) ] [; ]
<object> ::=
{ [ server_name.database_name.schema_name. | database_name. [ schema_name ] .  | schema_name. ] table_or_view_name }


-- 예시
DELETE FROM test;
  • 테이블 내 데이터를 삭제하며, 테이블 용량이 감소하지 않는다. 데이터를 삭제해도 사용 스토리지를 반환하지 않는다.
  • Commit 이전에는 Rollback이 가능하다. Rollback 정보를 기록하기 때문에 수행 완료에 시간이 걸린다.
  • 행(row)이 많은 테이블의 데이터 삭제 시 많은 시스템 자원을 소모한다.
  • 전체 또는 일부를 삭제하며, 삭제 행수를 반환한다.

 

TRUNCATE

DDL(Data Definition Language, 데이터 정의 언어) 중 하나

TRUNCATE TABLE [ { database_name.[ schema_name ]. | schema_name . } ] table_name [ ; ]

-- 예시
TRUNCATE TABLE test;
  • 테이블의 모든 행을 삭제하여, 테이블 용량이 줄어들고 인덱스 등도 삭제한다. 테이블이 사용하던 스토리지 중 테이블 생성 시 할당된 공간만 남기고 전부 반환한다. 
  • RollBack이 불가능하다.
  • 삭제 행수를 반환하지 않는다.