Domanda

esiste un'alternativa per mysql_insert_id() funzione php per PostgreSQL?La maggior parte dei framework risolve parzialmente il problema trovando il valore corrente della sequenza utilizzata nell'ID.Tuttavia, a volte la chiave primaria non è una colonna seriale....

È stato utile?

Soluzione

Dal punto di vista PostgreSQL, in pseudo-codice:

 * $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() funziona solo dove hai OID.Gli OID sono disattivati ​​per impostazione predefinita a partire da PostgreSQL 8.1.

Quindi, a seconda della versione di PostgreSQL in tuo possesso, dovresti scegliere uno dei metodi sopra indicati.Idealmente, ovviamente, utilizzare una libreria di astrazione del database che astrae quanto sopra.Altrimenti, nel codice di basso livello, appare come:

Metodo uno:INSERIRE...RITORNO

// 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];

Metodo due:INSERIRE;ultimaval()

$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];

Metodo tre:valoresuccessivo();INSERIRE

$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 scommessa più sicura sarebbe il terzo metodo, ma è ingombrante.Il più pulito è il primo, ma dovresti eseguire un PostgreSQL recente.Tuttavia, la maggior parte delle librerie di astrazione db non utilizza ancora il primo metodo.

Altri suggerimenti

Dai un'occhiata a RETURNING clausola facoltativa per un'istruzione INSERT.(Link alla documentazione ufficiale di PostgreSQL)

Ma fondamentalmente, fai:

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

e l'istruzione INSERT stessa restituisce l'id (o qualsiasi altra espressione specificata) della riga interessata.

Da 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')");

Questo dovrebbe sempre fornire una chiave univoca, poiché la chiave recuperata dal database non verrà mai più recuperata.

Puoi anche usare:

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

Devi specificare in pg_fetch_result il numero della riga e il nome del campo che stai cercando, questo è un modo più preciso per ottenere i dati che ti servono, ma non so se questo ha qualche penalità in termini svolgimento della query.Ricorda che questo metodo è per le versioni PostgreSQL 8.2 e successive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top