我有一点诙谐的问题。比如说,我在一个存在主键的表中插入了一些包含一些数据的行。如何“选择”刚刚插入的行的主键?
我应该更具体,并提到我现在 使用SQLite。
答案 0 :(得分:48)
答案 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())
而:
如果您创建的 YourTable 的主键替换为 rowid (即,一列pk定义为 INTEGER PRIMARY KEY ),则可以使用:
SELECT last_insert_rowid()
这是常见的情况。
最后,这对于WITHOUT_ROWID表不起作用。
请检查:
答案 7 :(得分:0)
对于 PostgreSQL,
INSERT INTO tablename (col1, col2, ...)
VALUES (val1, val2, ...)
RETURNING idcol;
<块引用>
可选的 RETURNING 子句导致 INSERT 根据实际插入(或更新,如果使用 ON CONFLICT DO UPDATE 子句)的每一行计算和返回值。这主要用于获取默认提供的值,例如序列号。但是,允许使用表列的任何表达式。
答案 8 :(得分:-2)
select MAX(id_column) from table
理论上,应该返回最后插入的id。如果它是一个繁忙的数据库,有许多插入,它可能不会得到你刚刚做的那个而是另一个。
无论如何,替代其他方法。