как получить последний вставленный идентификатор базы данных Sqlite с помощью Zend_Db

Я пытаюсь получить последний вставленный идентификатор строки базы данных Sqlite в моем приложении PHP. Я использую адаптер Zend Framework PDO Sqlite для работы с базой данных. метод lastInsertId() должен был дать мне результаты, но это не так. В документации PDO на php.net я читал, что lastInsertId() может не работать одинаково во всех базах данных. но не будет ли это работать на sqlite вообще? Я попытался перезаписать метод lastInsertId() адаптера следующим образом:

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

но это тоже не работает. просто возвращает 0 каждый раз, когда я его вызываю. есть ли какой-то особый чистый способ найти последний вставленный идентификатор?


person farzad    schedule 03.02.2009    source источник


Ответы (5)


Учитывая базу данных SQLite3 с таблицей b, следующим образом:

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()».

person TML    schedule 03.02.2009
comment
это сработало хорошо. работал даже Zend_Db_Adapter_Pdo_Sqlite::lastInsertId(). моей проблемой было определение автоинкремента. благодаря. - person farzad; 03.02.2009

PDO::lastInserId()

см.: http://us2.php.net/manual/en/pdo.lastinsertid.php

person user570307    schedule 10.01.2011

Не используй

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

вместо этого используйте

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

or

SELECT id FROM tablename ORDER DESC LIMIT 1;
person 789789789    schedule 02.03.2012

Эй, попробуйте этот запрос. Но я не знаю о PHP.

SELECT *
FROM tablename
WHERE id = (SELECT COUNT(*) FROM tablename);
person Community    schedule 26.06.2009
comment
Я видел ситуации, когда последние значения идентификатора не связаны с количеством строк в базе данных, например, некоторые строки были удалены ранее. поэтому я не думаю, что использование count(*) - хороший подход - person farzad; 28.06.2009

person    schedule
comment
В целом это считается плохой практикой. A) чтобы вернуть правильный результат для параллельного доступа, он должен быть инкапсулирован в сериализуемую транзакцию или иметь заблокированную таблицу, и B) это дополнительный (ненужный) запрос, когда СУБД поддерживает возврат последнего идентификатора вставки (в этом случае оно делает). - person Bob Gettys; 07.04.2010