我已在存在主键的表中插入了包含一些数据的行。如何“SELECT”刚刚插入的行的主键?
我应该更具体并提到我目前 使用 SQLite。
SQL 服务器:
您可以使用
@@IDENTITY
。在插入语句之后,您可以运行:
select @@identity
这将为您提供刚刚插入的记录的主键。如果您打算稍后使用它,我建议您保存它:
set @MyIdentity = @@identity
如果您在存储过程中使用它并希望在应用程序中重新访问它,请确保没有关闭。
对于 MySQL,使用 LAST_INSERT_ID()
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
您还应该能够启动事务、插入行,并使用某个具有您刚刚插入的唯一值的字段(例如时间戳或 GUID)来选择行。只要您有一个良好的唯一字段来选择行,这应该适用于几乎所有支持事务的 RDBMS。
如果您需要在表上存在触发器时在 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”才能获取返回值)。
对于 SQLite:
SELECT [Column_1], [Column_2],... [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())
而:
如果您创建了YourTable,并替换了主键rowid(即一列pk定义为INTEGER PRIMARY KEY),您只需使用:
SELECT last_insert_rowid()
这是一个常见的情况。
最后,这不适用于WITHOUT_ROWID表。
请检查:
对于 PostgreSQL,
INSERT INTO tablename (col1, col2, ...)
VALUES (val1, val2, ...)
RETURNING idcol;
可选的 RETURNING 子句导致 INSERT 根据实际插入(或更新,如果使用 ON CONFLICT DO UPDATE 子句)的每行计算并返回值。这主要用于获取默认提供的值,例如序列号。但是,任何使用表列的表达式都是允许的。
我能想到的最好和最简单的。对于每一行,我都包含createdBy和createdAt(yyyy-mm-dd hh:mm:ss)列。在任何时候(不一定在插入后立即),我可以使用另一个sql查询(SELECT * FROM TABLE WHERE createdBy =“who-knows”和createdAt =“whatever-is-the-time”
select MAX(id_column) from table
理论上,应该返回最后插入的 id。如果它是一个繁忙的数据库,正在进行许多插入操作,那么它可能不会得到您刚刚所做的一个,而是另一个。
无论如何,这是其他方法的替代方案。