2009-09-01 2 views
17

기본 키가 자동 증가로 설정되어 있습니다.테이블에 삽입하고 기본 키 값을 가져 오는 방법은 무엇입니까?

여러 쿼리를 수행 중이고 다른 테이블 (IsIdentity = TRUE)의 외래 키로 사용할 기본 키 값을 검색해야합니다.

삽입 쿼리를 수행 할 때 기본 키 값을 다시 가져 오는 우아한 방법이 있습니까? 지금 당장 나는 재귀 적으로 보이고 그 열에서 가장 높은 가치를 얻고있다.

제안 사항?

답변

25
insert into YourTable values (...) 

SCOPE_IDENTITY와 새로운 PK()

select scope_identity() 
+1

한 응은) (SCOPE_IDENTITY를 사용하여 갈 수있는 가장 신뢰할 수 있고 효율적인 방법입니다! –

+0

더 이상 좋은 방법은 없습니다. – HLGEM

+0

@HLGEM 그 다음은 무엇입니까? – paz

2

거룩한 쓰레기를 얻을!

단지 SCOPE_IDENTITY() 함수를 호출 :

insert into your_talble(col1,col2) values('blah','more blah') 
select scope_identity() 

다른 문을 삽입 할 경우 가장 높은 값을 선택하면 오류가 반환됩니다 때문이다. 함수 scope_identity()은 현재 상황 (즉 성명서)에 작성된 ID를 반환합니다.

4

SCOPE_IDENTITY()는 아마도 원하는 것일 수 있습니다. 이 코드는 실행되는 동일한 코드 컨텍스트에 의해 삽입 된 마지막 레코드의 ID를 반환합니다.

IDENT_CURRENT ('tablename')은 동시성 문제가 발생할 수 있습니다. 즉, 다른 레코드가 INSERT와 IDENT_CURRENT 호출 사이에 삽입되지 않는다는 보장은 없습니다.

나는 VillageIdiot의 폭발이 의미하는 놀라움의 원천에 대해 확신 할 수 없다.하지만 나는이 질문이 전혀 중복되지 않는 것으로 아주 놀랐다.

+0

을 사용하면 dup로 플래그가 지정되지 않아서 기쁩니다. 먼저 찾았습니다 !! – htm11h

31

SQL Server 2005 이상을 사용하는 경우 OUTPUT 절을 사용할 수 있습니다.

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 
go 

insert into T 
output inserted.pk 
values ('new item'); 
go 

drop table T; 

출력을 클라이언트뿐만 아니라 테이블로 보낼 수 있습니다. 예 :

create table T(
    pk int identity primary key, 
    dat varchar(20) 
); 

create table U(
    i int identity(1001,1) primary key, 
    T_pk int not null, 
    d datetime 
); 
go 


insert into T 
output inserted.pk, getdate() 
into U(T_pk,d) 
values ('new item'), ('newer item'); 
go 

select * from T; 
select * from U; 
go 

drop table T, U; 

SQL Server 2008부터는 더 많은 가능성을 위해 "복합 DML"을 사용할 수 있습니다.

+1

PK가 신원이 아닌 경우에도 작동하는 또 하나의 아주 좋은 접근법 - 좋은 호출 –

+0

유용 할 수있는 2보다는 하나의 성명 – gbn

+0

+1 : 여기에서 새로운 것을 배웠습니다 – van

2

scope_identity()를 사용해야합니다. 그리고 insert 문과 scope_identity()를 트랜잭션으로 래핑하는 것이 좋습니다.

6
INSERT INTO YourTable (1, 2, etc.) 
OUTPUT inserted.yourIDcolumn 
VALUES (value1, value2, value...) 

참고 :이 MS SQL 2005을위한 더 큰

관련 문제