如何使用Zend_Db获取Sqlite数据库中最后插入的ID?

5

我正在尝试在我的PHP应用程序中获取Sqlite DB的最后插入行Id。我正在使用Zend Framework的PDO Sqlite适配器进行数据库处理。lastInsertId()方法应该给我结果,但它并没有。在php.net上的PDO文档中我看到,lastInsertId()在所有数据库上可能不会都起作用。但是它真的完全不能在sqlite上工作吗?我尝试通过以下方式重写适配器的lastInsertId()方法:

// Zend_Db_Adapter_Pdo_Sqlite
public function lastInsertId() {
    $result = $this->_connection->query('SELECT last_insert_rowid()')->fetch();
    return $result[0];
}

但是它也不起作用。每次调用它都返回0。有没有一种特殊的干净方式来查找最后插入的ID?

5个回答

11

假设有一个包含表b的SQLite3数据库,其结构如下:

BEGIN TRANSACTION;
CREATE TABLE b(a integer primary key autoincrement, b varchar(1));
COMMIT;

这段代码给我返回了 lastInsertId

public function lastInsertId() {
    $result = $this->_connection->query('SELECT last_insert_rowid() as last_insert_rowid')->fetch();
    return $result['last_insert_rowid'];
}

也就是说,如果您的表定义正确,那么您唯一的问题可能是尝试获取键$result[0] - 此外,每当您使用计算列时,我建议使用上面所示的"AS"关键字对列进行别名。如果您不想为该列设置别名,在SQLite3中该列应命名为"last_insert_rowid()"。


它运行得很好。甚至 Zend_Db_Adapter_Pdo_Sqlite::lastInsertId() 也可以工作。我的问题在于自增定义。谢谢。 - farzad

1

0

Do not use

SELECT * FROM tablename WHERE id = (SELECT COUNT(*) FROM tablename);

使用代替

SELECT MAX(id) as id FROM tablename LIMIT 1;

或者

SELECT id FROM tablename ORDER DESC LIMIT 1;

-1
SELECT * FROM [tablename] ORDER BY id DESC LIMIT 1

一般来说,这被认为是不好的实践。 A)为了返回并发访问的正确结果,它必须封装在可序列化事务中或者将表格锁定,B)当DBMS支持返回最后插入ID(在这种情况下是这样)时,这是一个额外的(不必要的)查询。 - Bob Gettys

-4

嘿,试试这个查询。但我不懂PHP。

SELECT *
FROM tablename
WHERE id = (SELECT COUNT(*) FROM tablename);

我见过这样的情况,即最后一个ID值与数据库中的行数无关,例如在此之前已删除了某些行。因此,我认为使用count(*)不是一个好的方法。 - farzad

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