관계형 데이터베이스(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)의 세부적인 작동 메커니즘 차이와 예외 처리 조건에 대한 더욱 자세한 명세는 아래 공식 마이크로소프트 기술 문서 버튼 링크를 통해 직접 검증해 보실 수 있습니다.
4. 맺음말
동시성(Concurrency) 처리가 핵심인 최신 웹 서비스 및 데이터베이스 설계에서 올바른 시스템 내장 채번 함수를 쓰는 것은 시스템 안정성을 좌우합니다. 무분별한 MAX() + 1 조회를 지양하고, 시스템 컨텍스트와 요구사항에 맞게 @@IDENTITY 또는 안정적인 SCOPE_IDENTITY()를 적재적소에 녹여내어 개발 효율을 향상시켜 보세요!