如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章

3.1 Zend_Db

Zend_db 联结表联接查询

将数据插入SQLite表后如何获取最后一行ID [重复]

如何使用 python 从 sqlite 获取数据?

如何从我的 sqlite 数据库中获取数据

如何使用 SQLite 从数据库表中获取一个字段?