2009-02-03 19 views
5

Estoy intentando buscar la última Id de fila insertada de un DB Sqlite en mi aplicación PHP. Estoy utilizando el adaptador PDO Sqlite de Zend Framework para el manejo de la base de datos. se supone que el método lastInsertId() me da los resultados, pero no es así. En la documentación de PDO en php.net, leí que el últimoInsertId() podría no funcionar igual en todas las bases de datos. pero ¿no funcionaría en sqlite en absoluto? Probé sobrescribir el método lastInsertId() del adaptador por esto:cómo insertar la última Id de una base de datos Sqlite usando Zend_Db

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

pero no funciona bien. simplemente devuelve 0 cada vez que lo llamo. ¿hay alguna forma especial y limpia de encontrar el último Id insertado?

Respuesta

10

Dada una base de datos SQLite3 con una mesa b, de la siguiente manera:

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

Este código me da un lastInsertId:

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

Eso es - si la tabla se define correctamente, su único problema Es probable que trates de obtener key $ result [0]; también, cada vez que utilizas una columna calculada, te recomendamos que hagas un aliasing de la columna con la palabra clave "AS" como lo he demostrado anteriormente. Si no desea alias la columna, en SQLite3 la columna debe llamarse "last_insert_rowid()".

+0

funcionó bien. incluso el Zend_Db_Adapter_Pdo_Sqlite :: lastInsertId() funcionó. mi problema fue la definición de autoincrement. Gracias. – farzad

+0

¿Qué, ningún crédito por la respuesta? ;) – TML

+0

Sí, claro. Gracias. ;) – farzad

-4

Oye, prueba esta consulta. Pero no sé sobre PHP.

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

He visto situaciones en las que los últimos valores de ID no están relacionados con el número de filas en la base de datos, por ejemplo, se han eliminado algunas filas anteriormente. así que no creo que usar count (*) sea un buen enfoque – farzad

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

Esto se considera una mala práctica en general. A) para devolver el resultado correcto para el acceso simultáneo, debe estar encapsulado en una transacción serializable o tener la tabla bloqueada, y B) es una consulta adicional (innecesaria) cuando el DBMS admite la devolución de la última identificación de inserción (en este caso lo hace). –

0

No utilice

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

en lugar de utilizar

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

o

SELECT id FROM tablename ORDER DESC LIMIT 1; 
Cuestiones relacionadas