如何使用 Zend_Db 获取 Sqlite 数据库的最后插入 ID
Posted
技术标签:
【中文标题】如何使用 Zend_Db 获取 Sqlite 数据库的最后插入 ID【英文标题】:how to get last inserted Id of a Sqlite database using Zend_Db 【发布时间】:2009-02-03 05:51:55 【问题描述】:我正在尝试在我的 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 吗?
【问题讨论】:
【参考方案1】:给定一个带有表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() 也有效。我的问题是自动增量的定义。谢谢。【参考方案2】:PDO::lastInserId()
见:http://us2.php.net/manual/en/pdo.lastinsertid.php
【讨论】:
【参考方案3】:不要使用
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;
【讨论】:
【参考方案4】:SELECT * FROM [tablename] ORDER BY id DESC LIMIT 1
【讨论】:
这通常被认为是不好的做法。 A)为了返回正确的并发访问结果,它必须封装在可序列化事务中或锁定表,B)当 DBMS 支持返回最后一个插入 id 时,这是一个额外的(不必要的)查询(在这种情况下)它确实)。【参考方案5】:嘿,试试这个查询。但是我不知道PHP。
SELECT *
FROM tablename
WHERE id = (SELECT COUNT(*) FROM tablename);
【讨论】:
我见过最后一个 ID 值与数据库中的行数无关的情况,例如之前删除了一些行。所以我不认为使用 count(*) 是一个好方法以上是关于如何使用 Zend_Db 获取 Sqlite 数据库的最后插入 ID的主要内容,如果未能解决你的问题,请参考以下文章