Pregunta

¿Existe una alternativa para mysql_insert_id() ¿Función php para PostgreSQL?La mayoría de los marcos resuelven el problema parcialmente al encontrar el valor actual de la secuencia utilizada en el ID.Sin embargo, hay ocasiones en las que la clave principal no es una columna serial....

¿Fue útil?

Solución

Desde el punto de vista de PostgreSQL, en pseudocó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 de forma predeterminada desde PostgreSQL 8.1.

Entonces, dependiendo de la versión de PostgreSQL que tengas, debes elegir uno de los métodos anteriores.Lo ideal, por supuesto, es utilizar una biblioteca de abstracción de bases de datos que abstraiga lo anterior.De lo contrario, en código de bajo nivel, se vería así:

Método uno:INSERTAR...REGRESANDO

// 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;último valor()

$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:siguienteval();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.Sin embargo, la mayoría de las bibliotecas de abstracción de bases de datos aún no utilizan el primer método.

Otros consejos

Revisar la Cláusula opcional DEVOLUCIÓN para una declaración INSERT.(Enlace a la documentación oficial de PostgreSQL)

Pero básicamente lo que haces:

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

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

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, porque 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');

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top