在SQL Server 2008或更高版本什麼是最好/最安全/最正確的方式最安全的方式從表中獲取最後一條記錄ID
- 檢索ID(基於自增主鍵)從數據庫中表?
- 檢索一些其他列的最後一行的值(如SELECT TOP 1 FROM TABLE ORDER BY DESC)?
在SQL Server 2008或更高版本什麼是最好/最安全/最正確的方式最安全的方式從表中獲取最後一條記錄ID
最安全的方式是在插入行的過程中輸出或返回scope_identity(),然後根據該ID檢索行。要避免使用@@身份,因爲當觸發器在場時你可以得到不正確的ID。
任何要求最大值/最高值1的技術都會遇到競爭條件,即同時添加2個人的競爭條件會在他們查找最高ID時返回相同的ID。
我讀過這篇文章http://msdn.microsoft.com/en-us/library/ms190315.aspx關於@@身份和scope_identity,看來你的答案是最合適的。在接受答案之前,我還有兩個問題 - 如果之前沒有插入,並且我們請求scope_identity(),它會返回任何內容嗎?另一種方法是,如果我要在應用程序中創建業務密鑰,然後將它們存儲到表中,並且我希望它們從身份派生,那麼查詢scope_identity()會很好嗎? – mare 2010-08-07 00:57:51
如果你未能插入任何東西scope_identity()將返回null;一旦你返回了scope_identity()並且擁有了標識字段,你就可以在查詢中使用它來返回該行,無論你決定什麼目的。 – Andrew 2010-08-07 09:59:41
另一種方式 -
select * from <table> where id=(select max(id) from <table>)
也可以通過這個鏈接 - 如果你的意思是選擇插入的最後一條記錄的ID
這是另一種方式,但我不確定它是否不會遇到與SELECT TOP.does相同的可能問題。如果有更深入的SQL知識的人對這兩種解決方案在高容量使用情況下的可靠性有多評論,那將會很好。 – mare 2010-08-06 08:45:13
而且,其
SELECT @@IDENTITY FROM table
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)。
第二個錯誤,如果任何行刪除,將給出錯誤的答案。 – 2014-08-13 11:30:40
我想,這其中也將工作:
SELECT * FROM ORDER BY ID DESC LIMIT 0,1
SELECT id FROM Table WHERE id = (SELECT MAX(id) FROM Table)
這裏表是指你的數據庫表名和ID意味着你的表字段名稱。
歡迎來到Stack Overflow!這個問題已經有了一個被接受的答案,並且在4年前增加了。在這種情況下,沒有額外的答案needend。 – 2015-01-29 06:39:13
@j_s_stack,他給出了更好的答案,那麼爲什麼你認爲呢? – partho 2016-10-19 07:50:50
這只是一個複製粘貼答案。請刪除它。 – 2017-07-27 07:24:01
稍微複雜一點是,您是希望發佈的最後一個仍在數據庫中的ID還是上次發佈的ID--記錄可能已被添加和刪除。在這種情況下,使用max/top等將無法獲得您的ID。 – Andrew 2010-08-06 11:57:22