2010-10-03 105 views
0

我想使用SQL INSERT語句添加一行。是否有可能作爲此聲明的一部分,我可以以某種方式獲得我不更新但是AUTO_INCREMENT主鍵的userId列的值。我需要這個值來更新另一個表,但是我不能在SELECT語句中立即跟隨Insert語句,因爲表中沒有其他唯一標識符可供選擇。SQL:是否可以將INSERT和SELECT語句合併爲一個

INSERT INTO objectUrl(disp_name, loggedIn) VALUES('please change this', true) 

是否有可能獲得行號(列名userId),如果是的話,你如何做到這一點?

+2

您使用的是什麼RDBMS?我猜測[也許MySQL](http://stackoverflow.com/questions/3558585/how-to-check-for-null-value-for-a-double-which-is-taken-from-a-database )?請用這些信息來標記你的sql問題。 – 2010-10-03 13:28:50

+0

@Martin Smith:MySQL – Ankur 2010-10-03 13:29:49

回答

3

在MySQL中,它被稱爲LAST_INSERT_ID()。我相信在技術上是正確的,這兩個語句應該包含在一個事務中,以便其他INSERT不會搞亂你返回的ID。

在SQL服務器中,您有IDENT_CURRENT('tablename'),它只能從該表中獲取(仍然需要事務才能安全)。你也可以使用SCOPE_IDENTITY(),理論上它會一直返回你期望的那個,只要你沒有在你的連接上做一些奇怪的事情。

+0

爲防止'SCOPE_IDENTITY'按預期返回,連接有什麼可能是'怪異'?對於多用戶環境,除非需要其他人的身份('IDENT_CURRENT'從任何會話和任何範圍**返回表的最新插入ID **),否則遠離'IDENT_CURRENT'。 'SCOPE_IDENTITY()'將起作用。 – 2010-10-03 13:38:20

+0

'SCOPE_IDENTITY()'應該可以工作*大部分時間 - 在SQL Server 2005/2008中顯然有一個涉及並行的錯誤:http://blog.sqlauthority.com/2009/03/24/sql-server- 2008-scope_identity-bug-with-multi-processor-parallel-plan-and-solution/ – LittleBobbyTables 2010-10-03 13:43:47

+0

@ p.campbell,如果微軟完全實現了ACID的精神,圍繞插入包裝一個事務並用IDENT_CURRENT選擇應該工作得很好。我不知道他們是否做過*。但它*應該*工作=) – colithium 2010-10-03 14:08:15

相關問題