SQL Server 를 사용 하여 기록 을 삽입 한 ID 가 져 오기(자동 번호)

최근 프로젝트 를 개발 하 는 과정 에서 문 제 를 만 났 습 니 다.기록 을 삽입 한 후에 바로 데이터베이스 에 있 는 ID 를 가 져 오 는 것 입 니 다.이 ID 는 증가 한 것 입 니 다.어떻게 합 니까?sql server 2005 에서 몇 가지 방식 으로 실현 할 수 있 습 니 다.
이 ID 를 가 져 오 려 면 가장 쉬 운 방법 은 검색 후 select@indentity 입 니 다.
--SQL 문 구 는 데이터베이스 와 표를 만든다

create database dbdemo
go
use dbdemo
go
create table tbldemo
(
    id int primary key identity(1,1),
    name varchar(20)
)
go
--아래 SQL 문 구 를 실행 하면 기록 삽입 에 대응 하 는 자가 증 열 값 을 찾 아 낼 수 있다
tbldemo 값 에 삽입('테스트')select@@idenity
SQL Server 2000 에는 세 가지 유사 한 기능 이 있 습 니 다:SCOPEIDENTITY、IDENT_CURRENT 와@IDENTITY 는 IDENTITY 열 에 삽 입 된 값 을 되 돌려 줍 니 다.
  1)IDENT_CURRENT 는 모든 세 션 과 그 어떠한 역할 영역 에 있 는 특정한 표 로 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.역할 영역 과 세 션 의 제한 을 받 지 않 고 지정 한 표 에 제 한 됩 니 다.
  2)@@IDENTITY 는 현재 세 션 의 모든 역할 영역 에서 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.
  3) SCOPE_IDENTITY 는 현재 세 션 과 현재 역할 영역 에 있 는 모든 표 의 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.
SCOPE_IDENTITY 와@IDENTITY 는 현재 세 션 의 모든 표 에서 생 성 된 마지막 표지 값 을 되 돌려 줍 니 다.하지만,SCOPEIDENTITY 는 현재 역할 영역 에 삽 입 된 값 만 되 돌려 줍 니 다.@@IDENTITY 는 특정한 역할 영역 에 제한 을 받 지 않 습 니 다.
예 를 들 어 두 개의 표 T1 과 T2 가 있 는데 T1 에 하나의 INSERT 트리거 를 정의 했다.한 줄 을 T1 에 삽입 하면 트리거 가 자극 되 고 T2 에 한 줄 을 삽입 합 니 다.이 예 는 두 가지 역할 영역 을 설명 한다.하 나 는 T1 에 삽입 되 고 다른 하 나 는 트리거 의 결과 로 T2 에 삽입 된다.
T1 과 T2 에 IDENTITY 열 이 있다 고 가정 하면@@IDENTITY 와 SCOPEIDENTITY 는 T1 에 있 는 INSERT 문장의 마지막 에 다른 값 을 되 돌려 줍 니 다.@@IDENTITY 는 현재 세 션 에 삽 입 된 모든 역할 영역 에 삽 입 된 마지막 IDENTITY 열 값 을 되 돌려 줍 니 다.이 값 은 T2 에 삽 입 된 값 입 니 다.
SQL Server 는 마지막 으로 기 록 된 자동 번호 ID 를 되 돌려 줍 니 다.
최근 개발 프로젝트 과정 에서 이런 문제 가 발생 했 습 니 다.기록 을 삽입 한 후 데이터베이스 에 추 가 된 ID 를 즉시 가 져 와 관련 된 데 이 터 를 처리 할 수 있 도록 하 는 것 입 니 다.어떻게 하 시 겠 습 니까?sql server 2000 에서 이렇게 할 수 있 습 니 다.몇 가지 방법 이 있 습 니 다.상세 한 것 은 아래 의 설명 과 대 비 를 보십시오.
1.이 ID 를 가 져 오 려 면 가장 간단 한 방법 은 다음 과 같 습 니 다.(아래 간단 하고 실 용적 인 예 를 들 어)
--데이터베이스 와 테이블 만 들 기
create database MyDataBase
use MyDataBase
create table mytable
(
id int identity(1,1),
name varchar(20)
)
--이 SQL 을 실행 하면 기록 삽입 에 대응 하 는 자증 열 값 을 방금 찾 아 낼 수 있다
mytable 값 에 삽입('이사')
select @@identity
두 세 가지 방식 의 비교
SQL Server 2000 에는 세 가지 유사 한 기능 이 있 습 니 다.그들 은 각각 SCOPE 입 니 다.IDENTITY、IDENT_CURRENT 와@IDENTITY 는 IDENTITY 열 에 삽 입 된 값 을 되 돌려 줍 니 다.
IDENT_CURRENT 는 모든 세 션 과 모든 역할 영역 에 있 는 특정한 표 의 마지막 에 생 성 된 표지 값 을 되 돌려 줍 니 다.IDENT_CURRENT 는 역할 영역 과 세 션 의 제한 을 받 지 않 고 지 정 된 표 에 제 한 됩 니 다.IDENT_CURRENT 는 모든 세 션 과 역할 영역 에 있 는 특정 표 에 생 성 된 값 을 되 돌려 줍 니 다.
@@IDENTITY 는 현재 세 션 의 모든 역할 영역 에서 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.
SCOPE_IDENTITY 는 현재 세 션 과 현재 역할 영역 에 있 는 모든 표 의 마지막 으로 생 성 된 표지 값 을 되 돌려 줍 니 다.
SCOPE_IDENTITY 와@IDENTITY 는 현재 세 션 의 모든 표 에서 생 성 된 마지막 표지 값 을 되 돌려 줍 니 다.하지만,SCOPEIDENTITY 는 현재 역할 영역 에 삽 입 된 값 만 되 돌려 줍 니 다.@@IDENTITY 는 특정한 역할 영역 에 제한 을 받 지 않 습 니 다.
예 를 들 어 두 개의 표 T1 과 T2 가 있 는데 T1 에 하나의 INSERT 트리거 를 정의 했다.한 줄 을 T1 에 삽입 하면 트리거 가 자극 되 고 T2 에 한 줄 을 삽입 합 니 다.이 예 는 두 가지 역할 영역 을 설명 한다.하 나 는 T1 에 삽입 되 고 다른 하 나 는 트리거 의 결과 로 T2 에 삽입 된다.
T1 과 T2 에 IDENTITY 열 이 있다 고 가정 하면@@IDENTITY 와 SCOPEIDENTITY 는 T1 에 있 는 INSERT 문장의 마지막 에 다른 값 을 되 돌려 줍 니 다.
@@IDENTITY 는 현재 세 션 에 삽 입 된 모든 역할 영역 에 삽 입 된 마지막 IDENTITY 열 값 을 되 돌려 줍 니 다.이 값 은 T2 에 삽 입 된 값 입 니 다.
SCOPE_IDENTITY()는 T1 에 삽 입 된 IDENTITY 값 을 되 돌려 줍 니 다.이 값 은 같은 역할 영역 에서 발생 하 는 마지막 INSERT 입 니 다.역할 영역 에서 표지 열 에 삽입 문 이 발생 하기 전에 SCOPE 호출 을 깨 웁 니 다.IDENTITY()함 수 는 이 함수 가 NULL 값 을 되 돌려 줍 니 다.
IDENTCURRENT('T1')와 IDENTCURRENT('T2')가 되 돌려 주 는 값 은 각각 이 두 표 가 마지막 으로 증가 한 값 이다.
ajqc 의 실험:(40 개의 로 컬 스 레 드,40+40 개의 원 격 스 레 드 를 동시에 병행 하여 테스트 하고 1200 W 줄 을 삽입)결론 은:
1.전형 적 인 직렬 연결 응용 프로그램 에서@IDENTITY 를 사용 할 수 없습니다.CII 850,256 M SD 기기 에서 1W 가 여러 줄 일 때 동시에 충돌 합 니 다.P42.8C,512 M DDR 에서 6000 여 줄 밖 에 안 될 때 동시에 충돌 합 니 다.
2.SCOPE_IDENTITY()는 절대적 으로 신뢰 할 수 있 으 며 저장 과정 에서 사용 할 수 있 으 며 트리거 도 만 들 지 않 고 충돌 하지 않 습 니 다.
SELECT   IDENT_CURRENT('TableName')   --지정 한 표 에서 생 성 된 마지막 표시 값 을 되 돌려 줍 니 다.  
SELECT   IDENT_INCR('tableame')--지정 한 표 의 표시 필드 증분 값 을 되 돌려 줍 니 다.
SELECT   IDENT_SEED('tableame')--지정 한 표 의 표시 필드 피 드 값 을 되 돌려 줍 니 다.
마지막 으로 기 록 된 자동 번 호 를 되 돌려 줍 니 다.
SELECT IDENT_CURRENT('TableName')
다음 자동 번호 되 돌리 기:  
SELECT   IDENT_CURRENT('TableName')   +   (SELECT   IDENT_INCR('TableName'))
SELECT@@IDENTITY--현재 세 션 의 모든 표 에서 생 성 된 마지막 표시 값 을 되 돌려 줍 니 다.
이상 은 sql server 2000 의 경우 입 니 다.그러나 my sql 이나 Oacle 에서 어떻게 실현 합 니까?어떻게 할 까요?본인 도 모색 중...만약 친구 가 이 처리 방식 을 알 고 있다 면,알려 주 는 것 을 잊 지 말고,함께 나 누 세 요!

좋은 웹페이지 즐겨찾기