2009-09-01 36 views
17

Tôi có một khóa chính được thiết lập để tăng tự động.Làm cách nào để chèn vào bảng và lấy lại giá trị khóa chính?

Tôi đang thực hiện nhiều truy vấn và tôi cần truy xuất giá trị khóa chính đó để sử dụng làm khóa ngoại trong bảng khác (IsIdentity = TRUE).

Có cách nào thanh lịch để lấy lại giá trị khóa chính khi tôi thực hiện truy vấn chèn không? Ngay bây giờ tôi đang requerying và nhận được giá trị cao nhất trong cột đó mà dường như thực sự hacky.

Mọi đề xuất?

Trả lời

25
insert into YourTable values (...) 

lấy PK mới với SCOPE_IDENTITY()

select scope_identity() 
+1

1 yup, sử dụng SCOPE_IDENTITY() là cách đáng tin cậy nhất và hiệu quả để đi! –

+0

NOt phương pháp tốt nhất nữa. – HLGEM

+0

@ HLGEM sau đó là gì? – paz

2

tào lao thánh !!!

chỉ cần gọi SCOPE_IDENTITY() chức năng:

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

vì chọn giá trị cao nhất sẽ trả về lỗi nếu bất kỳ tuyên bố khác thực hiện một chèn. chức năng scope_identity() trả về danh tính được tạo trong ngữ cảnh hiện tại (theo tuyên bố của bạn)

4

SCOPE_IDENTITY() có lẽ là những gì bạn muốn. Nó trả về ID của bản ghi cuối cùng được chèn vào bởi cùng một ngữ cảnh mã mà nó thực thi.

IDENT_CURRENT ('tablename') phải chịu sự cố đồng thời. Tức là, không có gì đảm bảo rằng một bản ghi khác sẽ không được chèn vào giữa INSERT và cuộc gọi tới IDENT_CURRENT.

Tôi phải thú nhận, tôi không chắc nguồn gốc của sự ngạc nhiên khi sự bùng nổ của VillageIdiot là gì, nhưng bản thân tôi khá ngạc nhiên rằng câu hỏi này dường như không trùng lặp chút nào.

+0

vui mừng vì nó không bị gắn cờ là một quảng cáo lừa đảo, tôi đã tìm thấy nó trước tiên !! – htm11h

31

Nếu bạn đang sử dụng SQL Server 2005 trở lên, bạn có thể sử dụng mệnh đề 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; 

Đầu ra có thể được chuyển hướng đến bảng cũng như cho khách hàng. Ví dụ:

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; 

Bắt đầu với SQL Server 2008, bạn có thể sử dụng "DML tổng hợp" để có nhiều khả năng hơn.

+1

+1 một cách tiếp cận rất tốt, mà cũng hoạt động nếu PK không phải là một bản sắc - tốt callè –

+0

Nó cũng là một tuyên bố chứ không phải là 2 mà có thể hữu ích – gbn

+0

+1: và học được điều gì đó mới ở đây – van

2

Bạn nên sử dụng scope_identity(). Và tôi khuyên bạn nên bọc câu lệnh chèn và scope_identity() vào giao dịch.

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

Lưu ý: Đây là dành cho MS SQL 2005 và lớn

Các vấn đề liên quan