last inserted example after php postgresql insert-id

inserted - php pdo get last id insert



mysql_insert_id alternativa para postgresql (4)

Consulte la cláusula opcional RETURNING para una instrucción INSERT. (Enlace a la documentación oficial de PostgreSQL)

Pero básicamente, lo haces:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

y la instrucción INSERT en sí misma devuelve la identificación (o la expresión que especifique) de la fila afectada.

¿Hay alguna alternativa para la función mysql_insert_id() php para PostgreSQL? La mayoría de los marcos están resolviendo el problema parcialmente al encontrar el valor actual de la secuencia utilizada en el ID. Sin embargo, hay ocasiones en que la clave principal no es una columna en serie ...


Desde el punto de vista de PostgreSQL, en pseudo-código:

* $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1 * $insert_id = SELECT nextval(''foo_seq''); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() solo funciona donde tienes OID. Los OID han estado desactivados por defecto desde PostgreSQL 8.1.

Entonces, dependiendo de la versión de PostgreSQL que tenga, debe elegir uno de los métodos anteriores. Idealmente, por supuesto, use una biblioteca de abstracción de base de datos que abstraiga lo anterior. De lo contrario, en el código de bajo nivel, se ve así:

Método uno: INSERTAR ... DEVOLVER

// yes, we''re not using pg_insert() $result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id"); $insert_row = pg_fetch_row($result); $insert_id = $insert_row[0];

Método dos: INSERTAR; lastval ()

$result = pg_execute($db, "INSERT INTO foo (bar) values (123);"); $insert_query = pg_query("SELECT lastval();"); $insert_row = pg_fetch_row($insert_query); $insert_id = $insert_row[0];

Método tres: nextval (); INSERTAR

$insert_query = pg_query($db, "SELECT nextval(''foo_seq'');"); $insert_row = pg_fetch_row($insert_query); $insert_id = $insert_row[0]; $result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");

La apuesta más segura sería el tercer método, pero es difícil de manejar. El más limpio es el primero, pero necesitarías ejecutar un PostgreSQL reciente. La mayoría de las bibliotecas de abstracción de db todavía no usan el primer método.


Desde php.net:

$res=pg_query("SELECT nextval(''foo_key_seq'') as key"); $row=pg_fetch_array($res, 0); $key=$row[''key'']; // now we have the serial value in $key, let''s do the insert pg_query("INSERT INTO foo (key, foo) VALUES ($key, ''blah blah'')");

Esto siempre debe proporcionar una clave única, ya que la clave recuperada de la base de datos nunca se recuperará nuevamente.


También puedes usar:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id"); $insert_row = pg_fetch_result($result, 0, ''foo_id'');

Debe especificar en pg_fetch_result el número de la fila y el nombre del campo que está buscando, esta es una forma más precisa de obtener los datos que necesita, pero no sé si esto tiene alguna penalización en el el rendimiento de la consulta. Recuerde que este método es para las versiones 8.2 y superiores de PostgreSQL.