2010-08-06 34 views
18

Trong SQL Server 2008 và cao hơn là tốt nhất/an toàn nhất/đúng nhất cáchcách an toàn nhất để có được ghi lại căn cước cuối cùng từ một bảng

  1. để lấy ID là gì (dựa trên autoincrementing khóa chính) ra khỏi cơ sở dữ liệu bàn?
  2. để truy lục giá trị của hàng cuối cùng của một số cột khác (như SELECT TOP 1 FROM ORDER BY DESC)?
+0

Biến chứng nhẹ là liệu bạn có muốn ID cuối cùng được phát hành vẫn còn trong cơ sở dữ liệu hay ID cuối cùng được phát hành - hồ sơ có thể được thêm và xóa. Trong trường hợp đó sử dụng một max/top etc sẽ thất bại để giúp bạn có được id đó. – Andrew

Trả lời

15

Cách an toàn nhất sẽ là xuất hoặc trả về scope_identity() trong thủ tục chèn hàng và sau đó truy lục hàng dựa trên ID đó. Bạn có thể tránh sử dụng @@ Identity vì bạn có thể nhận được ID không chính xác khi trình kích hoạt đang hoạt động.

Bất kỳ kỹ thuật yêu cầu giá trị tối đa/đầu 1 đều có điều kiện chủng tộc khi 2 người thêm cùng một lúc, sau đó sẽ nhận được cùng một ID khi họ tìm ID cao nhất.

+1

Tôi đã đọc bài viết này http://msdn.microsoft.com/en-us/library/ms190315.aspx về @@ identity và scope_identity và có vẻ như câu trả lời của bạn là câu trả lời phù hợp nhất. Tôi có hai câu hỏi bổ sung trước khi chấp nhận câu trả lời - nếu không có chèn trước và chúng tôi yêu cầu scope_identity(), nó sẽ trả về bất cứ điều gì?Và một trường hợp khác, nếu tôi tạo khóa kinh doanh trong ứng dụng của mình và sau đó lưu chúng vào bảng, và tôi muốn chúng xuất phát từ danh tính, bạn có nên truy vấn scope_identity() không? – mare

+0

Nếu bạn không chèn bất cứ thứ gì scope_identity() sẽ trả về null; một khi bạn đã trả về scope_identity() và có trường nhận dạng, bạn có thể sử dụng nó trong các truy vấn để trở về hàng đó cho bất kỳ mục đích nào bạn quyết định. – Andrew

2

Thêm một cách -

select * from <table> where id=(select max(id) from <table>) 

Ngoài ra bạn có thể kiểm tra vào liên kết này -

http://msdn.microsoft.com/en-us/library/ms175098.aspx

+0

đó là một cách khác nhưng tôi không chắc chắn nếu nó không bị các vấn đề tương tự có thể SELECT TOP..does. Sẽ rất tuyệt nếu một người có nhận xét sâu hơn về kiến ​​thức SQL về cả hai giải pháp đáng tin cậy như thế nào trong một kịch bản sử dụng khối lượng cao. – mare

4
1. SELECT MAX(Id) FROM Table 
+1

Cảm ơn! tốt nhất, chỉ một :) – KingRider

1

Và nếu bạn có nghĩa là chọn ID của bản ghi cuối cùng chèn, của nó

SELECT @@IDENTITY FROM table 
13
SELECT IDENT_CURRENT('Table') 

Bạn có thể một trong những examole này:

SELECT * FROM Table 
WHERE ID = (
    SELECT IDENT_CURRENT('Table')) 

SELECT * FROM Table 
WHERE ID = (
    SELECT MAX(ID) FROM Table) 

SELECT TOP 1 * FROM Table 
ORDER BY ID DESC 

Nhưng người đầu tiên sẽ hiệu quả hơn vì không chỉ số quét là cần thiết (nếu bạn có chỉ mục trên cột Id).

Giải pháp thứ hai tương đương với giải pháp thứ ba (cả hai đều cần quét bảng để lấy id tối đa).

+0

thứ hai là sai, Nếu bất kỳ hàng nào bị xóa sẽ trả lời sai. –

2

Tôi nghĩ cái này cũng sẽ làm việc:

SELECT * FROM ORDER BY id DESC LIMIT 0, 1

3
SELECT id FROM Table WHERE id = (SELECT MAX(id) FROM Table) 

Dưới đây Bảng nghĩa tên Bảng cơ sở dữ liệu của bạn và id nghĩa bảng của bạn tên trường.

+3

Chào mừng bạn đến với Stack Overflow! Câu hỏi này đã có câu trả lời được chấp nhận và trong phần bổ sung ist 4 tuổi. Trong trường hợp này, không cần thêm câu trả lời. –

+2

@j_s_stack, anh ấy đã đưa ra câu trả lời tốt hơn, vậy tại sao bạn chọn câu trả lời đó? – partho

+0

Đây chỉ là câu trả lời dán bản sao. Xin vui lòng loại bỏ nó. –

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