Me he encontrado con un problema respecto al tipo de datos serial de PostgreSQl utilizando el framework de acceso a datos adodb para php.
El método Insert_ID() no funciona como esperaba con el tipo de datos serial, al haber utilizado este framework siempre con Mysql y para los id’s suelo utilizar tipos int con auto_increment.
Así el método siempre devuelve el último id insertado.
El caso es que al final, buscando en la documentación de adodb en español he encontrado el método GenID($seqName = ‘adodbseq’,$startID=1), que lo que hace es generar un número de secuencia, y si no existe lo creará.
$seqName, es el nombre que tiene la secuencia del tipo serial.
$startID=1, es el primer número de la secuencia si la secuencia no existe y la debe crear, por defecto 1.
Según la documentación:
Funciona para interbase, mysql, postgresql, oci8, oci8po, mssql, y los drivers basados en ODBC.
Uuuupss actualización:
Se me había olvidado… GenId() genera el siguiente número de la secuencia, y no el último número de la secuencia insertado.
Para que su función sea como la de Insert_ID():
GenId(seqName)-1
July 19th, 2007 at 17:17
Oye muchas gracias, ya me estaba rompiendo la cabeza investigando porque no devolvía el último ID.
August 13th, 2007 at 23:57
Hola, interesante. veo que tu la habias utilizado con mysql, como se hace con mysql y campos auto_increment.
Gracias
August 14th, 2007 at 12:37
Hola Jopehi,
después de ejecutar el execute(”insert…”) con el método InsertID() recuperas el valor del auto_increment insertado.
August 14th, 2007 at 15:25
Genial, funciona aunque en realidad me toco hacerlo haciendo referencia a la conexion, asi:
$conex = NewADOConnection($driver);
$conex->Connect($host_db,$user_db,$passwd_db,$db);
$conex->debug=$debug_adodb;
if (!$conex) {
echo “Error”;
die( $error_con_db );
exit;
}
$query=”insert into …… bla bla”;
$conex->Execute($query);
$lastID=$conex->Insert_ID();
Pero funciona, gracias
March 24th, 2008 at 23:30
No me convence, http://www.bartbusschots.ie/blog/?p=614 esto esta mejor
March 25th, 2008 at 1:54
Hola javier,
Según leo en ese post no está(o estaba) implementado el getGeneratedKeys en el driver de Postgres y por eso lo tuvo que hacer de esa forma, es algo así a lo que me ocurrió con InsertID.
Personalmente prefiero esta forma de hacerlo, aunque la opción de hacerlo con una query siempre está disponible, por ser lo más parecido a usar InsertID y por que veo más portable el código en caso de un cambio de gestor de base de datos.