2010-08-06 81 views
18

在SQL Server 2008或更高版本什麼是最好/最安全/最正確的方式最安全的方式從表中獲取最後一條記錄ID

  1. 檢索ID(基於自增主鍵)從數據庫中表?
  2. 檢索一些其他列的最後一行的值(如SELECT TOP 1 FROM TABLE ORDER BY DESC)?
+0

稍微複雜一點是,您是希望發佈的最後一個仍在數據庫中的ID還是上次發佈的ID--記錄可能已被添加和刪除。在這種情況下,使用max/top等將無法獲得您的ID。 – Andrew 2010-08-06 11:57:22

回答

15

最安全的方式是在插入行的過程中輸出或返回scope_identity(),然後根據該ID檢索行。要避免使用@@身份,因爲當觸發器在場時你可以得到不正確的ID。

任何要求最大值/最高值1的技術都會遇到競爭條件,即同時添加2個人的競爭條件會在他們查找最高ID時返回相同的ID。

+1

我讀過這篇文章http://msdn.microsoft.com/en-us/library/ms190315.aspx關於@@身份和scope_identity,看來你的答案是最合適的。在接受答案之前,我還有兩個問題 - 如果之前沒有插入,並且我們請求scope_identity(),它會返回任何內容嗎?另一種方法是,如果我要在應用程序中創建業務密鑰,然後將它們存儲到表中,並且我希望它們從身份派生,那麼查詢scope_identity()會很好嗎? – mare 2010-08-07 00:57:51

+0

如果你未能插入任何東西scope_identity()將返回null;一旦你返回了scope_identity()並且擁有了標識字段,你就可以在查詢中使用它來返回該行,無論你決定什麼目的。 – Andrew 2010-08-07 09:59:41

2

另一種方式 -

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

也可以通過這個鏈接 - 如果你的意思是選擇插入的最後一條記錄的ID

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

+0

這是另一種方式,但我不確定它是否不會遇到與SELECT TOP.does相同的可能問題。如果有更深入的SQL知識的人對這兩種解決方案在高容量使用情況下的可靠性有多評論,那將會很好。 – mare 2010-08-06 08:45:13

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

謝謝!最好的,只有一個:) – KingRider 2015-06-17 14:34:36

1

而且,其

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

你可以這樣examole之一:

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 

但因爲不需要索引掃描第一個將更有效率(如果你的ID列有索引)。

第二個解決方案相當於第三個(它們都需要掃描表以獲取最大ID)。

+0

第二個錯誤,如果任何行刪除,將給出錯誤的答案。 – 2014-08-13 11:30:40

2

我想,這其中也將工作:

SELECT * FROM ORDER BY ID DESC LIMIT 0,1

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

這裏表是指你的數據庫表名和ID意味着你的表字段名稱。

+3

歡迎來到Stack Overflow!這個問題已經有了一個被接受的答案,並且在4年前增加了。在這種情況下,沒有額外的答案needend。 – 2015-01-29 06:39:13

+2

@j_s_stack,他給出了更好的答案,那麼爲什麼你認爲呢? – partho 2016-10-19 07:50:50

+0

這只是一個複製粘貼答案。請刪除它。 – 2017-07-27 07:24:01

相關問題