출처: 인터넷 저자: 미상
- 데이터베이스 및 테이블 생성
데이터베이스 생성 MyDataBase
MyDataBase를 사용하세요
create table mytable
id int 항등식(1,1),
이름: 바르차르(20)
)
--이 SQL을 실행하여 방금 삽입된 레코드에 대응하는 자기 증가 열의 값을 찾습니다
mytable 값('Li Si')에 삽입
선택권@@identity
2. 세 가지 방법의 비교
SQL Server 2000에는 SCOPE_IDENTITY, IDENT_CURRENT, @@IDENTITY 세 가지 유사한 기능이 있으며, 모두 IDENTITY 열에 반환 값이 삽입됩니다.
IDENT_CURRENT 특정 세션과 범위에서 생성된 마지막 식별 값을 반환합니다. IDENT_CURRENT 범위나 세션에 제한되지 않고, 지정된 테이블에 의해 제한됩니다. IDENT_CURRENT 특정 세션과 범위에서 생성된 값을 반환합니다.
@@IDENTITY 현재 세션의 모든 범위에 있는 테이블에 대해 생성된 마지막 식별 값을 반환합니다.
SCOPE_IDENTITY 현재 세션에 대해 마지막으로 생성된 값과 현재 범위 내 모든 테이블을 반환합니다
SCOPE_IDENTITY와 @@IDENTITY는 현재 세션의 어떤 테이블에서든 생성된 마지막 식별 값을 반환합니다. 하지만 SCOPE_IDENTITY은 현재 범위에 삽입된 값만 반환합니다; @@IDENTITY 특정 범위에 국한되지 않습니다.
예를 들어, INSERT 트리거가 정의된 T1과 T2 두 개의 테이블이 있습니다. T1에 행이 삽입되면 트리거가 작동하고 T2에 행이 삽입됩니다. 이 예시는 트리거 결과로 T1과 T2에 각각 다른 스코프가 있음을 보여줍니다.
T1과 T2 모두 IDENTITY 열을 가진다고 가정하면, @@IDENTITY와 SCOPE_IDENTITY는 T1의 INSERT 문장 끝에서 서로 다른 값을 반환합니다.
@@IDENTITY 현재 세션의 스코프에 삽입된 마지막 IDENTITY 열 값을 반환하며, 이는 T2에 삽입된 값입니다.
SCOPE_IDENTITY()는 T1에 삽입된 IDENTITY 값을 반환하는데, 이는 동일한 범위에서 마지막으로 발생한 INSERT입니다. 만약 SCOPE_IDENTITY() 함수가 식별 열에 삽입 문장이 범위에서 발생하기 전에 호출되면, 함수는 NULL 값을 반환합니다.
IDENT_CURRENT('T1')와 IDENT_CURRENT('T2')가 반환하는 값은 각각 두 테이블의 마지막 자기 증가 값입니다.
AJQC의 실험: (40개의 로컬 스레드, 40+40개의 원격 스레드가 동시에 테스트, 1200W 행 삽입), 결론은 다음과 같습니다:
1. 일반적인 계단식 응용에서. @@IDENTITY 사용할 수 없으며, CII850 256M SD 기기에서 1W가 다중 행 전송될 경우 동시 충돌이 발생할 수 있습니다. P42.8C와 512M DDR에서는 6000개 이상의 회선만 있을 때 동시 충돌이 발생합니다.
2.SCOPE_IDENTITY()는 절대적으로 신뢰할 수 있으며 저장 과정에서 사용할 수 있으며, 트리거도 만들 필요가 없고 동시 충돌도 없습니다
SELECT IDENT_CURRENT('TableName') - 지정된 테이블에서 생성된 마지막 라벨 값을 반환합니다
SELECT IDENT_INCR('TableName') - 지정된 테이블에 대해 표시된 필드 증가 값을 반환합니다
SELECT IDENT_SEED('TableName') - 지정된 테이블의 표시된 필드 시드 값을 반환합니다
마지막으로 삽입된 레코드의 자동 번호를 반환합니다
선택 IDENT_CURRENT('테이블 이름')
다음 자동 번호로 돌아가기:
SELECT IDENT_CURRENT('TableName')+(SELECT IDENT_INCR('TableName'))
SELECT @@IDENTITY - 현재 세션의 모든 테이블에서 생성된 마지막 표시된 값을 반환합니다.
|