SQL - 插入行并返回主键

时间:2011-12-12 18:51:48

标签: sql sqlite insert row primary-key

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

  

我应该更具体,并提到我现在   使用SQLite。

9 个答案:

答案 0 :(得分:48)

对于MS SQL Server:

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

SELECT SCOPE_IDENTITY() AS NewID

答案 1 :(得分:29)

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

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

答案 2 :(得分:6)

对于MySQL,请使用LAST_INSERT_ID()

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

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

答案 3 :(得分:6)

MS SQL

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

select @@identity

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

set @MyIdentity = @@identity

如果您在存储过程中使用它并希望在应用程序中访问它,请确保关闭nocount。

答案 4 :(得分:2)

如果您需要在表中存在触发器时在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,那么此查询的返回值可以直接转换为整数(您必须在.NET SqlCommand上调用“ExecuteScalar”才能获得返回)。

答案 5 :(得分:0)

对于Postgresql:

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

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

答案 6 :(得分:0)

对于SQLite:

SELECT [Column_1],  [Column_2],...  [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())


  • Column_1 Column_2 ,... Column_n :是 YourTable 的主键。

如果您创建的 YourTable 的主键替换为 rowid (即,一列pk定义为 INTEGER PRIMARY KEY ),则可以使用:

SELECT last_insert_rowid()

这是常见的情况。
最后,这对于WITHOUT_ROWID表不起作用。

请检查:

https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

答案 7 :(得分:0)

对于 PostgreSQL,

INSERT INTO tablename (col1, col2, ...)
VALUES (val1, val2, ...)
RETURNING idcol;
<块引用>

可选的 RETURNING 子句导致 INSERT 根据实际插入(或更新,如果使用 ON CONFLICT DO UPDATE 子句)的每一行计算和返回值。这主要用于获取默认提供的值,例如序列号。但是,允许使用表列的任何表达式。

https://www.postgresql.org/docs/current/sql-insert.html

答案 8 :(得分:-2)

select MAX(id_column) from table

理论上,应该返回最后插入的id。如果它是一个繁忙的数据库,有许多插入,它可能不会得到你刚刚做的那个而是另一个。

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