SQL - 插入行并返回主键

Sam*_*rty 28 sql sqlite row insert primary-key

我有点诙谐的问题.比如说,我在一个存在主键的表中插入了一些包含一些数据的行.如何"选择"刚刚插入的行的主键?

我应该更具体,并提到我目前正在使用SQLite.

Mic*_*son 50

对于MS SQL Server:

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

SELECT SCOPE_IDENTITY() AS NewID
Run Code Online (Sandbox Code Playgroud)

  • 适用于SQL Server - **但只有**如果您有一个类型为"INT IDENTITY"(或"BIGINT IDENTITY")的主键 - 任何其他类型的PK(如GUID或其他)都不是****由`SCOPE_IDENTITY()`支持 (19认同)

mar*_*c_s 34

对于SQL Server 2005及更高版本,无论您的主键是什么类型,您始终可以使用该OUTPUT子句返回插入的值:

INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的(谢谢!),但请注意,“PrimaryKey”不是关键字(如果您尝试使用它,将导致“无效的列名“PrimaryKey”。”。它应该替换为您的实际列名称。 (3认同)
  • @marc_s 是的,只是为以后任何像我这样的复制和粘贴笨蛋留下评论:) (3认同)
  • 这是要走的路,因为它适用于任何主键。它需要作为标量查询而不是非查询执行来执行,但这是微不足道的。 (2认同)

Dag*_*bit 6

对于MySQL,使用LAST_INSERT_ID()

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

您还应该能够启动事务,插入行,并使用一些具有您刚刚插入的唯一值的字段(如时间戳或guid)来选择行.这应该适用于任何支持事务的RDBMS,只要你有一个很好的唯一字段来选择行.


Far*_*han 6

SQL Server:

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

select @@identity
Run Code Online (Sandbox Code Playgroud)

这将为您提供刚插入的记录的主键。如果您打算以后使用它,建议您保存它:

set @MyIdentity = @@identity
Run Code Online (Sandbox Code Playgroud)

如果您在存储过程中使用此功能,并希望在应用程序中重新使用它,请确保没有任何问题。

  • 如果您有“ IDENTITY”列-我建议您使用[`SCOPE_IDENTITY()`而不是`@@ IDENTITY`](http://blog.sqlauthority.com/2007/03/25/sql-server-identity -vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-record) (4认同)