Question

est-il une alternative pour mysql_insert_id() fonction php pour PostgreSQL?La plupart des cadres sont en train de résoudre le problème en partie par trouver la valeur courante de la séquence utilisée dans l'ID.Cependant, il ya des moments que la clé primaire n'est pas une série de colonnes....

Était-ce utile?

La solution

À partir de PostgreSQL point de vue, en pseudo-code:

 * $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() ne marche que si vous avez des Oid.Oid ont été désactivés par défaut depuis PostgreSQL 8.1.

Donc, en fonction de la version de PostgreSQL que vous avez, vous devez en choisir un de la méthode ci-dessus.Idéalement, bien sûr, utiliser une abstraction de base de données de la bibliothèque qui ne tient pas à l'écart de la ci-dessus.Sinon, dans le code bas-niveau, il ressemble:

Méthode un:INSÉRER...De RETOUR

// 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éthode deux:INSÉRER;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éthode trois:nextval();INSÉRER

$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);");

Le pari le plus sûr serait la troisième méthode, mais il est lourd.Le plus propre est le premier, mais vous auriez besoin pour exécuter une récente PostgreSQL.La plupart db abstraction des bibliothèques n'ont pas encore utiliser la première méthode bien.

Autres conseils

Découvrez l' De RETOUR clause facultative pour une instruction INSERT.(Lien officiel documentation PostgreSQL)

Mais, fondamentalement, vous ne:

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

et l'instruction INSERT lui-même renvoie l'id (ou quel que soit l'expression que vous spécifiez) de la ligne.

À partir de 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')");

Cela devrait toujours fournir de clé unique, parce que la clé récupérée à partir de la base de données sera jamais récupérée à nouveau.

Vous pouvez également utiliser:

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

Vous devez spécifier dans pg_fetch_result le numéro de la ligne et le nom du domaine que vous recherchez, c'est une manière plus précise pour obtenir les données dont vous avez besoin, mais je ne sais pas si cela a une sanction dans l'exécution de la requête.Rappelez-vous que cette méthode est valable pour les versions de PostgreSQL 8.2 et jusqu'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top