자동 증가 값 생성 (IDENTITY)
DB를 설계하는데 있어서 데이터가 생성될 때마다 자동으로 값이 증가하는 컬럼을 생성해야 하는 경우가 존재한다. 이럴 때 주로 사용하는 것이, MSSQL에서는 IDENTITY이다.
사용법
IDENTITY는 아래와 같은 방법으로 테이블을 생성할 때 사용한다.
CREATE TABLE test (
idx int identity (1, 1) -- (초기값, 증가값)
)
identity (초기값, 증가값) 을 입력하여 초기값과 증가 값을 조절할 수 있으며, 아예 입력을 하지 않은 경우에는 기본 값으로 1부터 하나씩 증가하도록 되어있다.
CREATE TABLE test (
idx int identity
)
임의 지정 및 초기화
기본적으로 identity를 설정하면, 증가값을 설정된 값으로 증가 값을 자동으로 생성한다. 그렇기 때문에, 중간에 데이터가 삭제되는 경우 해당 증가 값을 뛰어 넘어서 생긴다. 이렇게 중간에 비는 데이터를 채워 넣거나 기존 시작 값을 변경하고 싶은 경우에 해당 방법을 사용할 수 있다.
-- 증가값 자동 지정 (기본 설정)
SET IDENTITY INSERT test OFF; -- test : 테이블명
-- 증가값 수동 지정
SET IDENTITY INSERT test ON;
-- 시작값 재지정
DBCC CHECKIDENT ('test', RESEED, 0) -- 0 : 시작값
증가 값은 기본적으로 자동 지정으로 설정되어 있으며, 이 상태의 경우 데이터를 강제적으로 insert해도 값을 넣을 수 없고, 아래와 같은 에러를 볼 수 있다.
[S001][544] IDENTITY_INSERT가 OFF로 설정되면 테이블 'test'의 ID 열에 명시적 값을 삽입할 수 없습니다.
그렇기 때문에 중간에 비는 데이터를 다시 채워 넣고 싶은 경우 IDENTITY_INSERT를 ON으로 설정한 뒤에 데이터를 입력하여야 정상적으로 처리할 수 있다.
초기화의 경우 DBCC CHECKIDENT를 사용하여, 진행할 수 있다. 데이터를 전부 삭제하여도 기존에 증가 값에 대한 값은 초기화하지 않으면 삭제된 상태로 유지되기 때문에, 다시 기존 초기값부터 재설정하여야 원하는 대로 데이터 처리가 가능하다.
자동 증가값 조회
프로시저에서 Insert 한 뒤 자동으로 증가한 IDENTITY 값을 조회하여야 하는 경우 사용한다.
주로, @@IDENTITY, IDENT_CURRENT(), SCOPE_IDENTITY() 세 방법을 사용하며 각각 사용처가 다르게 사용된다.
-- 현재 세션의 테이블에서 생성된 마지막 ID 값 반환 (제한 x)
SELECT @@IDENTITY
-- 현재 세션의 테이블에서 생성된 마지막 ID 값 반환 (현재 범위만)
SELECT SCOPE_IDENTITY()
-- 지정된 테이블에서 생성된 마지막 ID 값 반환
SELECT IDENT_CURRENT('test') -- 테이블명(test)
오류가 발생하거나 개체를 볼 수 있는 권한이 없으면 NULL을 반환하며, 주로 특정 테이블의 마지막 ID 반환에는 IDENT_CURRENT를 사용하고 현재 세션 내의 작업만을 대상으로 하는지 여부에 따라 @@IDENTITY와 SCOPE_IDENTITY가 다르게 사용된다고 생각되면 조금 이해가 편하다.
'데이터베이스 > Mssql' 카테고리의 다른 글
저장 프로시저 활용 (DECLARE, SET) : 변수 적용 (0) | 2021.09.25 |
---|---|
저장 프로시저 활용 (IF EXISTS) : 데이터 유무 확인 조건문 (2) | 2021.09.14 |
저장 프로시저 (Stored Procedure) 란? (0) | 2021.09.13 |