2010-10-05 65 views
2

我看了一些其他問題,它們似乎與SQL-Server無關。SQL-Server常見問題 - 檢索剛剛插入的ID

給出的簡單示例查詢:

INSERT INTO tblComments (comment, user) VALUES ('lol', 'Guest') 

現在假設創建新用戶後,我需要插入在需要最後輸入ID其它表更多的數據,我會做:

SELECT TOP 1 ID FROM tblComments ORDER BY ID DESC 

要檢索最後輸入的ID,(希望)在此期間沒有執行任何查詢,並且返回的ID確實是前一個查詢的值。

我確保我的表格正常化,但是我有時遇到插入值可能不必獨特的情況,所以我如何保證返回的ID是插入的最後一個?

回答

6

您的方法受到競爭條件的限制。

相反,使用SCOPE_IDENTITY

select scope_identity() 
+0

如果你把兩個查詢放在同一個事務中,你應該相當確定它是正確的ID。 – 2010-10-05 12:21:10

+0

競賽條件或種族危害是電子系統或過程中的缺陷,由此過程的輸出和/或結果出乎意料且嚴重依賴於其他事件的順序或時間。該術語源於兩個信號相互競爭以首先影響輸出的想法。 (Wikipedia) – 2010-10-05 12:22:28

+0

這個問題被標記爲'uniqueidentifier' – 2010-10-05 12:23:45

0

除了@ RedFilter的建議,你也應該看:如果你想這是插入任何 最後 身份

  1. @@ IDENTITY即使插入在當前範圍內沒有完成 。
  2. IDENT_CURRENT獲取插入到特定表 中的最後一個 標識,無論會話或範圍如何。

在你的情況下,SCOPE_IDENTITY可能是要走的路,除非你想獲得該身份,即使它被插入到不同的會話或範圍中。

而只是要清楚SCOPE_IDENTITY返回插入到當前會話和作用域中的任何表中的最後一個標識。