2010-10-03 122 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