SQL - 插入行并返回主键

问题描述 投票:0回答:10

我已在存在主键的表中插入了包含一些数据的行。如何“SELECT”刚刚插入的行的主键?

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

sql sqlite insert row primary-key
10个回答
68
投票

对于 MS SQL Server:

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

SELECT SCOPE_IDENTITY() AS NewID

57
投票

对于 SQL Server 2005 及更高版本,无论主键是什么类型,您始终可以使用

OUTPUT
子句 返回插入的值:

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

8
投票

SQL 服务器:

您可以使用

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

select @@identity

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

set @MyIdentity = @@identity

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


6
投票

对于 MySQL,使用 LAST_INSERT_ID()

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

您还应该能够启动事务、插入行,并使用某个具有您刚刚插入的唯一值的字段(例如时间戳或 GUID)来选择行。只要您有一个良好的唯一字段来选择行,这应该适用于几乎所有支持事务的 RDBMS。


3
投票

如果您需要在表上存在触发器时在 MS SQL 中检索新索引,那么您必须使用一些解决方法。简单的输出将不起作用。你必须做这样的事情(在 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”才能获取返回值)。


2
投票

对于 SQLite:

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


  • Column_1Column_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


1
投票

对于 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


0
投票

对于 Postgresql:

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

来源:PostgreSQL函数用于最后插入的ID


0
投票

我能想到的最好和最简单的。对于每一行,我都包含createdBy和createdAt(yyyy-mm-dd hh:mm:ss)列。在任何时候(不一定在插入后立即),我可以使用另一个sql查询(SELECT * FROM TABLE WHERE createdBy =“who-knows”和createdAt =“whatever-is-the-time”


-4
投票
select MAX(id_column) from table

理论上,应该返回最后插入的 id。如果它是一个繁忙的数据库,正在进行许多插入操作,那么它可能不会得到您刚刚所做的一个,而是另一个。

无论如何,这是其他方法的替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.