실무에서도 두 개의 차이를 대강 알고 사용했었지만 요번 SQLD를 준비하면서 위의 내용으로 문제를 하두 풀다보니 이제 두개의 차이점을 명확히 알겠다. 이렇게 기억하고 있을 때 메모해놓기 위해 글을 작성한다.
1. TRUNCATE
1-1. Truncate 특징
1) DDL 명령어이다.
2) 모든 레코드(행)를 삭제해버리는 특징이 있다.
3) 조건절 사용을 못한다 (where절 사용 불가)
4) IDENTITY를 초기화 할 수 있다.
5) 테이블 구조, 열, 제약조건, 인덱스는 그대로 남는다.
6) 트랜잭션 로그 공간을 덜 사용한다.
> delete문은 행을 한번에 하나씩 제거하고 삭제된 각 행에 대해 트랜잭션 로그를 기록하게 된다.
그에 반해 truncate는 해당 테이블의 데이터 저장소의 페이지를 취소하는 방식으로 데이터를 제거하고 페이지 할당 취소만을 트랜잭션에 넣기 때문에 공간을 덜 사용한다.
7) Auto Commit이라서 한번 실행하면 복구 할 수 없다.
1-2. TRUNCATE의 사용구문
TRUNATE TABLE [테이블명]
추가로 IDENTITY는 고유ID값이나 이력 관련 부분에 있어서 키값을 매겨 자동 증가열을 사용하는 경우 사용된다.
보통 키값(PK)으로 사용되는 경우가 많으며 이 부분을 아래의 예제 처럼 (1,1)로 잡아놓는다면 해당 값은 1행마다 1씩 자동 증가가 되서 번호가 부여된다.
1-3. IDENTITY 예제
CREATE TABLE [dbo].[UserTable](
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[name] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable
결과값)
위의 결과값을 보면 알 수 있듯 자동으로 1씩 증가 채번이 된다.
이제 이 자동 증가열 값이 적용되어있는 테이블에 Truncate를 사용하면 최종 설정 값을
초기화시켜 다시 1부터 시작된다고 보면 된다.
이제 Delete를 알아보자.
2. DELETE
2-1. Delete 특징
1) 조건(where)절을 사용하여 특정 행을 삭제할 수 있다.
2) identity값을 초기화 시키질 못한다.
> 만약 제약조건으로 인해 delete를 사용하게 됐을 때 자동증가열을 초기화 시키고 싶다면,
DBCC CHECKIDENT를 사용하여 초기화 해주면 된다.
3) AutoCommit이 아니라서 Rollback을 이용해 삭제한 데이터를 살릴 수 있다.
2-2. DELETE의 사용구문
DELETE FROM [테이블명] --전체 행 삭제
-- OR
DELETE FROM [테이블명] WHERE [컬럼명] = [값] -- 조건절
2-3. DELETE 의 IDENTITY 예제
CREATE TABLE [dbo].[UserTable](
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[name] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable
---조회값---
id name
1 안곰돌
2 김여우
3 족제비
delete from UserTable
---결과값---
id name
X X -- 값 없음.
---다시 Insert---
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable
---조회값---
id name
4 안곰돌 --identity가 초기화 되지 않아 4부터 시작됨.
5 김여우
6 족제비
위의 예제를 보면 delete의 identity가 초기화 안한다는 말이 무엇인지 이해가 갈것이다.
결론
두 명령어의 차이는 뭐가 더 좋다 나쁘다가 아닌 쓰임새에 맞게 사용하면 된다.
truncate는 테이블에 있는 전체 행을 삭제하고 identity값을 초기화 시키고 싶을 때 사용하면 된다.
delete는 조건절을 이용하여 삭제하고싶은 행이 있을 때 사용하면 되며 identity값과 관련 없을 때 사용하면 된다.
추가로 전체 행을 삭제해야되는 기능을 구현할 때면 삭제할때마다 해당 행을 트랜잭션
로그에 남기지 않는 TRUCATE가 속도가 더 빠르다.
'Database > RDBMS' 카테고리의 다른 글
[MSSQL] INSERT문의 기본적인 3가지 사용법 (0) | 2021.11.26 |
---|---|
[MSSQL] DBCC CHECKIDENT란 무엇일까? (0) | 2021.11.23 |
[MSSQL] 프로시저 전체 삭제 쿼리 (0) | 2021.11.17 |
[MSSQL] DB에 접속한 사용자 수 조회 (0) | 2021.11.17 |
[MSSQL] DB 접속자 정보 조회 (0) | 2021.11.17 |
댓글