如何在SQLite中获取最后插入的ID?

29
有没有内置函数可以在SQLite中获取最后插入行的ID。 例如:在MySQL中,我们有LAST_INSERT_ID()这样的函数。对于sqllite,是否有可用于执行相同过程的函数。
请帮助我。
谢谢

如何使用Zend DB获取SQLite数据库的最后插入ID? https://dev59.com/1UbRa4cB1Zd3GeqP0G3f 以及http://php.net/manual/en/function.sqlite-last-insert-rowid.php … 谷歌是你的朋友。 - Aif
您的问题可能已经被问过:https://dev59.com/1UbRa4cB1Zd3GeqP0G3f - Kannika
我可以问一下您为什么要点赞吗?这个问题已经在同一个网站上被问过了。 - Yaqub Ahmad
6个回答

29

SQLite

可以使用SQLite last_insert_rowid()函数来获取:

last_insert_rowid()函数返回调用该函数的数据库连接中最后插入的行的ROWID。该SQL函数是sqlite3_last_insert_rowid() C/C++接口函数的包装器。

PHP

此函数在PHP版本/绑定中称为sqlite_last_insert_rowid()

如果创建为自动增量字段,则返回最近插入到数据库dbhandle中的行的rowid。


1
请注意,使用此函数不是“线程安全”的,因此如果另一个线程恰好在同一时间插入了某些内容,则可能会出现错误。 - rogerdpack
2
@rogerdpack,你有参考资料说明这不是线程安全的吗?答案中提供的参考资料表明它提供了最后一行插入“从调用函数的数据库连接” - 这会让我认为它是线程安全的,除非您有多个线程使用相同的连接。而如果您有多个线程通过不同的连接进行插入,则每个线程将正确地看到同一线程插入的最后一行ID(通常情况下,这就是要模拟的LAST_INSERT_ID())。 - mith
2
@MikeThomson 公平的问题:http://www.sqlite.org/c3ref/last_insert_rowid.html “如果一个单独的线程在sqlite3_last_insert_rowid()函数正在运行时在同一数据库连接上执行新的INSERT操作,并且因此更改了最后插入的rowid,则由sqlite3_last_insert_rowid()返回的值是不可预测的,可能不等于旧的或新的最后插入的rowid。”另请参见https://dev59.com/HXI95IYBdhLWcg3w2Rzz。 - rogerdpack

16

当使用PDO SQLite 与SQLite版本3时,可以这样:

$insert = "INSERT INTO `module` (`mid`,`description`) VALUES (
            NULL,
            :text
            );
        ";
$stmt = $conn->prepare($insert);
$stmt->execute(array(':text'=> $text));

echo $conn->lastInsertId()

4

它有一个last_insert_rowid()函数

last_insert_rowid()函数返回调用该函数的数据库连接中最后插入的行的ROWID。



1

这是一段对我来说可行的C#短方法。对于我的目的来说,Int32足够大。

public static Int32 GetNextID( SqliteConnection AConnection )
{
  Int32 result = -1;

  using ( SqliteCommand cmd = AConnection.CreateCommand() )
  {
    cmd.CommandText = "SELECT last_insert_rowid();";
    using ( SqliteDataReader r = cmd.ExecuteReader() )
    {
      if ( r.Read() )
        result = (Int32) r.GetInt64( 0 );
    }
  }

  return result;
}

0

我对SQLite还很陌生,而且这个帖子已经很老了,所以我认为需要更新一下,因为我觉得有一种更简单、更短的方法可以获取最后插入行的'id'。我使用了->querySingle()而不是->exec(),并在我的SQL语句末尾包含了returning id

我觉得这可能更可靠和线程安全,因为它是实际插入语句的结果。甚至可能会减轻资源的处理负担。

    $id = $db->querySingle("insert into names (first, last) values ('john', 'do') returning id;");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接