2011-12-12 66 views
16

我有一点机智的问题。比方说,我在表中存在主键的地方插入一行数据。如何“选择”刚插入的行的主键?SQL - 插入一行并返回主键

我应该更具体,并提到我目前使用SQLite 。

+6

您正在使用哪种RBDMS? –

回答

38

对于MS SQL服务器:

SCOPE_IDENTITY()将您的当前范围内返回你最后生成的标识值:

SELECT SCOPE_IDENTITY() AS NewID 
+13

适用于SQL Server - **,但只适用于**如果您有主键类型为“INT IDENTITY”(或“BIGINT IDENTITY”) - 任何其他类型的PK(如GUID或其他) *由'SCOPE_IDENTITY()'支持' –

+0

真实的,好的一点......我会+1你的答案,因为你已经覆盖了这种情况。 –

+0

@marc_s:或数字(x,0):猜测SCOPE_IDENTITY()的类型... http://msdn.microsoft.com/en-us/library/ms190315.aspx – gbn

22

对于SQL Server 2005和了,不管是什么类型的主关键是,你总是可以用OUTPUT clause返回插入的值:

INSERT INTO dbo.YourTable(col1, col2, ...., colN) 
OUTPUT Inserted.PrimaryKey 
VALUES(val1, val2, ....., valN) 
+1

这是要走的路,因为它适用于任何主键。它需要执行一个标量查询而不是一个非查询执行,但这是微不足道的。 – ChokesMcGee

+1

好方法,但是如果你的表有触发器,你必须使用OUTPUT ... INTO ...输出到中间表。 – Ian

5

对于MySQL,使用LAST_INSERT_ID()

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

你也应该能够启动一个事务,插入该行,并使用具有您刚刚插入的唯一值的一些字段中选择该行,像时间戳或指导。这应该适用于任何支持事务的RDBMS,只要您有一个很好的唯一字段来选择行。

4

MS SQL

您可以使用@@ IDENTITY。在插入语句后,您可以运行:

select @@identity 

这将为您提供刚刚插入的记录的主键。如果您打算以后使用它,我建议将其保存:如果您在存储过程中使用这一点,并希望访问它放回你的应用程序

set @MyIdentity = @identity 

,确保已关闭NOCOUNT。

+4

如果你有'IDENTITY'列 - 我建议你使用['SCOPE_IDENTITY()'而不是'@@ IDENTITY'](http://blog.sqlauthority.com/2007/03/25/sql-server-身份 - 范围 - 身份 - 身份 - 身份 - 当前 - 检索 - 最后插入身份记录) –

0

对于PostgreSQL:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id')) 

来源:https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id

+1

PGSQL可以做得更好,检查退货。 – BastetFurry

+0

根据BastetFurry的评论,请参阅['INSERT'](http://www.postgresql.org/docs/current/static/sql-insert.html)“命令的'RETURNING'子句。引用doc:'可选的RETURNING子句会导致INSERT根据实际插入的每一行计算并返回一个或多个值。这主要用于获取默认值提供的值,例如序列号 –

1

如果你需要的时候出现在表上的触发器,那么你必须使用一个小的解决方法来检索MS SQL的新指标。简单的OUTPUT将不起作用。你必须做这样的事情(在VB.NET):

DECLARE @newKeyTbl TABLE (newKey INT); 
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _ 
SELECT newKey FROM @newKeyTbl;" 

如果使用.NET,然后从该查询返回的值可以直接转换为一个整数(你必须调用“的ExecuteScalar”上.NET SqlCommand来获得返回)。

0
select MAX(id_column) from table 

那在理论上应该返回你最后插入的id。如果它是一个繁忙的数据库,并且有很多插入操作,则可能无法获得您刚完成的操作,而是另一个。

无论如何,替代其他方法。