2011-12-12 35 views
16

Tôi có một vấn đề nhỏ dí dỏm. Nói, tôi đã chèn một hàng với một số dữ liệu trong một bảng có khóa chính. Làm thế nào một "SELECT" khóa chính của hàng một vừa chèn vào?SQL - Chèn một hàng và trả lại khóa chính

Tôi nên cụ thể hơn và đề cập rằng tôi hiện đang sử dụng SQLite .

+6

Bạn đang sử dụng RBDMS nào? –

Trả lời

38

Đối với MS SQL Server:

SCOPE_IDENTITY() sẽ trở lại cho bạn những giá trị bản sắc tạo ra cuối cùng trong phạm vi hiện tại của bạn:

SELECT SCOPE_IDENTITY() AS NewID 
+13

Hoạt động cho SQL Server - ** nhưng chỉ ** nếu bạn có khóa chính của loại 'INT IDENTITY' (hoặc' BIGINT IDENTITY') - bất kỳ loại PK nào khác (như GUID hoặc cái gì khác) là ** không * * được hỗ trợ bởi 'SCOPE_IDENTITY()' –

+0

Đúng, điểm tốt ... Tôi sẽ +1 câu trả lời của bạn khiến bạn có tình huống đó. –

+0

@marc_s: hoặc số (x, 0) quá: đoán loại SCOPE_IDENTITY() ... http://msdn.microsoft.com/en-us/library/ms190315.aspx – gbn

22

Đối với SQL Server 2005 trở lên, và bất kể những gì gõ chính của bạn là, bạn luôn có thể sử dụng OUTPUT clause để trả lại giá trị được chèn:

INSERT INTO dbo.YourTable(col1, col2, ...., colN) 
OUTPUT Inserted.PrimaryKey 
VALUES(val1, val2, ....., valN) 
+1

Đây là cách để đi, vì nó hoạt động trên bất kỳ khóa chính nào. Nó đòi hỏi phải thực hiện như một truy vấn vô hướng thay vì một truy vấn không truy vấn, nhưng đó là tầm thường. – ChokesMcGee

+1

Phương pháp tốt, nhưng bạn phải sử dụng OUTPUT ... INTO ... để đưa vào bảng trung gian nếu bảng của bạn có trình kích hoạt. – Ian

5

Đối với MySQL, sử dụng LAST_INSERT_ID()

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Bạn cũng sẽ có thể bắt đầu một giao dịch, chèn hàng, và chọn hàng sử dụng một số lĩnh vực mà có một giá trị duy nhất mà bạn vừa chèn, giống như một dấu thời gian hoặc guid. Điều này sẽ làm việc trong khá nhiều bất kỳ RDBMS nào hỗ trợ các giao dịch, miễn là bạn có một trường duy nhất tốt để chọn hàng với.

4

MS SQL

Bạn có thể sử dụng @@ IDENTITY. Sau câu lệnh chèn, bạn có thể chạy:

select @@identity 

Điều này sẽ cung cấp cho bạn khóa chính của bản ghi bạn vừa chèn vào. Nếu bạn dự định sử dụng nó sau này, tôi khuyên bạn nên lưu nó:

set @MyIdentity = @identity 

Nếu bạn đang sử dụng thủ tục lưu trữ này và muốn truy cập lại trong ứng dụng, hãy chắc chắn có phần thưởng.

+4

Nếu bạn có cột 'IDENTITY' - tôi khuyên bạn nên sử dụng [' SCOPE_IDENTITY() 'thay vì' @@ IDENTITY'] (http://blog.sqlauthority.com/2007/03/25/sql-server- identity-vs-scope_identity-vs-ident_current-retrieve-last-insert-identity-of-record) –

0

Đối với PostgreSQL:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id')) 

Nguồn: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id

+1

PGSQL có thể làm tốt hơn, hãy kiểm tra RETURNING. – BastetFurry

+0

Mỗi bình luận của BastetFurry, xem mệnh đề 'RETURNING' của lệnh [' INSERT'] (http://www.postgresql.org/docs/current/static/sql-insert.html). Để trích dẫn tài liệu: 'Mệnh đề RETURNING tùy chọn làm cho INSERT tính toán và trả về (các) giá trị dựa trên mỗi hàng thực sự được chèn vào. Điều này chủ yếu hữu ích để có được các giá trị được cung cấp theo mặc định, chẳng hạn như số thứ tự nối tiếp.' –

1

Nếu bạn cần lấy lại chỉ số mới trong MS SQL khi có trigger trên bàn sau đó bạn phải sử dụng một chút workaround. Một OUTPUT đơn giản sẽ không hoạt động. Bạn phải làm một cái gì đó như thế này (trong VB.NET):

DECLARE @newKeyTbl TABLE (newKey INT); 
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _ 
SELECT newKey FROM @newKeyTbl;" 

Nếu sử dụng .NET, sau đó giá trị trả về từ truy vấn này có thể được đúc trực tiếp đến một số nguyên (bạn phải gọi là "ExecuteScalar" trên NET SqlCommand để có được sự trở lại).

0
select MAX(id_column) from table 

Điều đó, theo lý thuyết, sẽ trả lại cho bạn id được chèn sau cùng. Nếu đó là một cơ sở dữ liệu bận rộn với nhiều chèn đi vào nó có thể không nhận được một trong những bạn vừa làm nhưng khác.

Nhưng dù sao, một giải pháp thay thế cho các phương pháp khác.

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