TRUNCATE TABLE 문은 SQL Server에서 테이블의 모든 레코드를 한 번에 삭제할 때 사용하는 명령어입니다. DELETE 명령과 결과적으로 비슷하지만, WHERE 절을 지원하지 않아 조건 없이 테이블 전체를 대상으로 동작한다는 점이 다릅니다.
SQL Server에서 TRUNCATE TABLE 기본 구문
TRUNCATE TABLE [database_name.] [schema_name.] table_name
[ WITH (PARTITIONS (파티션번호 | 파티션번호 TO 파티션번호 | ...)) ];
매개변수 설명
database_name
선택 사항입니다. 값을 지정하면 해당 이름의 데이터베이스에 있는 테이블이 대상이 됩니다.
schema_name
선택 사항입니다. 삭제하려는 테이블이 속한 스키마(네임스페이스)의 이름입니다.
table_name
레코드를 삭제하고자 하는 테이블의 이름입니다.
WITH (PARTITIONS (파티션번호 | 파티션번호 TO 파티션번호))
선택 사항이며 파티션이 적용된 테이블에만 사용할 수 있습니다. 지정 시 해당 번호의 파티션에 있는 레코드만 삭제됩니다. 여러 파티션을 지정하려면 쉼표로 구분하거나 범위(TO) 형식으로 나타낼 수 있습니다. 이 절을 파티션이 없는 일반 테이블에 사용하면 SQL Server가 오류를 반환합니다. 또한 이 기능은 모든 버전의 SQL Server에서 지원되지 않습니다.
사용 시 주의사항
- 테이블의 모든 레코드를 삭제하면 IDENTITY 열의 카운터가 초기화되어 새 레코드가 삽입될 때 다시 1부터 시작합니다.
- 외래 키(Foreign Key)로 참조되고 있는 테이블의 레코드는 TRUNCATE로 삭제할 수 없습니다.
- 테이블의 전체 레코드를 삭제하려면 해당 테이블에 대한 ALTER TABLE 권한이 있어야 합니다.
TRUNCATE TABLE 예제
SQL Server에서 테이블의 데이터를 통째로 지울 때 TRUNCATE TABLE이 가장 빠른 방법입니다. TRUNCATE는 행 단위로 로그를 기록하지 않기 때문에 개별 행 복구에는 부적합하지만, DROP 후 CREATE로 테이블을 재생성하는 것보다 훨씬 간편하고 효율적입니다. 아래 예제를 살펴보겠습니다.
TRUNCATE TABLE nhanvien;
이 문장은 nhanvien 테이블의 모든 레코드를 삭제합니다.
위 명령은 아래의 DELETE 문과 결과가 같습니다.
DELETE FROM nhanvien;
두 명령 모두 테이블의 모든 데이터를 삭제하지만, DELETE는 행마다 로그를 남겨 작업을 되돌릴 수 있는 반면 TRUNCATE는 최소 로깅 방식으로 더 빠르게 처리된다는 차이가 있습니다.
이번에는 데이터베이스 이름까지 포함한 예제를 살펴보겠습니다.
TRUNCATE TABLE totn.danhba;
이 예제는 totn이라는 데이터베이스에 있는 danhba 테이블의 모든 레코드를 삭제합니다.
파티션을 활용한 TRUNCATE TABLE 예제
특정 파티션의 레코드만 삭제하고 싶다면 TRUNCATE TABLE 명령에 WITH PARTITIONS 절을 함께 사용하면 됩니다.
TRUNCATE TABLE nhanvien
WITH (PARTITIONS (1 TO 5, 7));
이 예제에서 nhanvien은 파티션 테이블이며, 위 문장을 실행하면 1번부터 5번 파티션과 7번 파티션에 속한 레코드들이 삭제됩니다.
자주 묻는 질문
질문: SQL Server에서 TRUNCATE TABLE 명령을 실행한 후 데이터베이스를 이전 상태로 되돌릴(롤백) 수 있나요?
답변: 네, 가능합니다. TRUNCATE TABLE 명령도 트랜잭션 내에서 실행했다면 ROLLBACK으로 되돌릴 수 있습니다. 아래 예제를 확인해 보세요.
CREATE TABLE bang_test (cot1 int);
INSERT INTO bang_test VALUES (1);
INSERT INTO bang_test VALUES (2);
INSERT INTO bang_test VALUES (3);
-- 트랜잭션 시작
BEGIN TRAN;
-- 테이블의 레코드 삭제
TRUNCATE TABLE dbo.bang_test;
-- 삭제 작업 롤백
ROLLBACK;
SELECT * FROM bang_test;
위 SELECT 문을 실행하면 다음과 같은 결과가 반환됩니다.
cot1
----------
1
2
3
결과를 보면 데이터베이스 상태가 이전으로 복원되어, TRUNCATE로 삭제했던 3개의 레코드가 그대로 남아 있는 것을 확인할 수 있습니다.