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

6 Responses to “Conocer el último id insertado de un campo serial con PostgreSQL y adodb”

  1. rafarods Says:

    Oye muchas gracias, ya me estaba rompiendo la cabeza investigando porque no devolvía el último ID.

  2. Jopehi Says:

    Hola, interesante. veo que tu la habias utilizado con mysql, como se hace con mysql y campos auto_increment.

    Gracias

  3. Dani Says:

    Hola Jopehi,

    después de ejecutar el execute(”insert…”) con el método InsertID() recuperas el valor del auto_increment insertado.

  4. Jopehi Says:

    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

  5. javier Says:

    No me convence, http://www.bartbusschots.ie/blog/?p=614 esto esta mejor

  6. Dani Says:

    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.

Post A Comment