MSSQL: INSERT문 실행 후 INSERT된 IDENTITY를 확인하는 방법



관계형 데이터베이스(RDBMS)를 다루다 보면 테이블에 데이터를 추가(INSERT)한 직후, 방금 생성된 자동 증가 일련번호(IDENTITY / ID) 값이 무엇인지 곧바로 확인해야 하는 상황이 자주 발생합니다.

특히 게시판에 글을 작성하자마자 첨부파일 테이블에 해당 게시글의 번호(Foreign Key)를 연결하여 저장하거나, 주문 마스터 테이블 입력 후 상세 주문 내역을 등록할 때 필수적인 작업입니다.

이번 포스팅에서는 SQL Server(MSSQL)에서 INSERT문 실행 후 새로 생성된 IDENTITY 값을 가장 안전하고 올바르게 확인하는 방법과 흔히 범하기 쉬운 실수에 대해 알아보겠습니다. 아래 가이드 내용을 마우스로 드래그하여 가독성 높은 반전 효과를 확인해 보세요!

⚠️ 안 좋은 채번 방식의 예시:
새로운 번호를 따기 위해 SELECT MAX(SEQ) + 1 FROM TABLE 과 같은 쿼리를 사용하는 경우가 있습니다. 이 방식은 동시 접속자가 많은 서비스에서 여러 사용자가 한 번에 데이터를 넣을 때 **동일한 번호가 중복 채번되어 심각한 데이터 충돌이나 무결성 오류**를 유발하므로 절대 피해야 합니다.

1. @@IDENTITY를 이용한 실시간 확인 방법

가장 보편적으로 쓰이는 방법은 SQL Server의 시스템 전역 변수인 @@IDENTITY를 호출하는 것입니다. 현재 세션에서 가장 최근에 생성된 ID 값을 반환합니다.

-- 1. 데이터 테스트 삽입
INSERT INTO TEST_TAB (VALUE) VALUES('AAA')

-- 2. 방금 들어간 자동 증가 값 확인
SELECT @@IDENTITY

💡 프로그램 코드 연동 시 필수 팁 (SET NOCOUNT ON)

웹 애플리케이션 코드(ASP, PHP, Java 등) 내부에서 위 쿼리를 실행해 즉시 레코드셋을 받아와야 할 때는 데이터베이스가 리턴하는 'xx개 행이 적용되었습니다'라는 메시지가 크래시를 유발할 수 있습니다. 이를 방지하기 위해 SET NOCOUNT ON을 앞선 명령어로 반드시 명시해 주는 것이 좋습니다.

-- 영향받은 행 수 메시지 출력을 끄고 일련번호만 깔끔하게 반환
SET NOCOUNT ON

INSERT INTO TEST_TAB (VALUE) VALUES('AAA')
SELECT @@IDENTITY
📌 중요 조건: @@IDENTITY는 반드시 데이터를 추가한 "동일한 커넥션(세션)" 내에서, 그리고 "INSERT 직후"에 연속으로 실행되어야만 정확한 내역을 가져옵니다. 세션이 끊기거나 다른 쿼리가 중간에 끼어들면 잘못된 값을 가져올 수 있습니다.

2. 다른 세션에서도 확인 가능한 IDENT_CURRENT

만약 현재 세션 상태와 무관하게, 특정 테이블에 가장 마지막으로 할당된 IDENTITY 값을 일괄적으로 조회하고 싶다면 MSDN 표준 함수인 IDENT_CURRENT를 활용할 수 있습니다.

-- 어떤 세션에서 넣었든 상관없이 특정 테이블의 현재 최종 ID 조회
SELECT IDENT_CURRENT('TEST_TAB')

이 방식은 호출한 사용자의 세션 범위나 쿼리가 실행된 블록 위치에 구애받지 않고, 지정된 테이블의 현재 고유 일련번호 상태를 그대로 스냅샷처럼 읽어올 수 있어 관리자용 조회 기능이나 특정 배치 작업 시 유용하게 쓰입니다.

3. 공식 MSDN 문서 및 기술 레퍼런스

SQL Server의 식별자 값 함수(SCOPE_IDENTITY, @@IDENTITY, IDENT_CURRENT)의 세부적인 작동 메커니즘 차이와 예외 처리 조건에 대한 더욱 자세한 명세는 아래 공식 마이크로소프트 기술 문서 버튼 링크를 통해 직접 검증해 보실 수 있습니다.

🌐 IDENTITY 및 채번 함수 상세 공식 가이드

4. 맺음말

동시성(Concurrency) 처리가 핵심인 최신 웹 서비스 및 데이터베이스 설계에서 올바른 시스템 내장 채번 함수를 쓰는 것은 시스템 안정성을 좌우합니다. 무분별한 MAX() + 1 조회를 지양하고, 시스템 컨텍스트와 요구사항에 맞게 @@IDENTITY 또는 안정적인 SCOPE_IDENTITY()를 적재적소에 녹여내어 개발 효율을 향상시켜 보세요!