Y at-il une alternative pour mysql_insert_id()
fonction PHP pour PostgreSQL? La plupart des cadres résolvent partiellement le problème en trouvant la valeur actuelle de la séquence utilisée dans l'ID. Toutefois, il existe des fois que la clé primaire n'est pas une colonne série ....mysql_insert_id alternative pour postgresql
Répondre
Du point de vue PostgreSQL, 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 fonctionne que lorsque vous avez OID. Les 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 devriez choisir l'une des méthodes ci-dessus. Idéalement, bien sûr, utilisez une bibliothèque d'abstraction de base de données qui résume ce qui précède. Sinon, dans le code de bas niveau, il ressemble à:
méthode: INSERT ... RETOURNER
// 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: INSERT; 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 c'est compliqué. Le plus propre est le premier, mais vous devez exécuter un PostgreSQL récent. La plupart des bibliothèques d'abstraction db n'utilisent pas encore la première méthode.
Consultez la RETURNING optional clause pour une instruction INSERT. (Lien vers la documentation PostgreSQL officielle)
Mais au fond, vous faites:
INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col
et l'instruction INSERT lui-même renvoie l'identifiant (ou autre expression que vous spécifiez) de la ligne concernée.
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 clé unique, car la clé récupérée de la base de données ne sera jamais récupéré à 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 indiquer dans pg_fetch_result le numéro de la ligne et le nom du champ que vous recherchez, c'est une façon plus précise pour obtenir les données vous avez besoin, mais je ne sais pas si cela a une certaine pénalité dans l'exécution de la requête. Rappelez-vous que cette méthode est pour les versions 8.2 de PostgreSQL et plus.
oui, il est déjà mentionné dans la réponse de @ angch. Notez que ceci n'est pas utilisable pour d'autres dialectes sql (sql-server, mysql, etc.) – Jeffrey04
- 1. Commande C#/SQLite équivalente pour la commande PHP mysql_insert_id()?
- 2. Bonne alternative pour ASpell?
- 3. Alternative TextMate pour Linux
- 4. alternative shlex pour Java
- 5. Ruby alternative pour Lucene
- 6. Alternative ISPConfig pour l'utilisation personnelle
- 7. Wix, PostgreSQL install, exécution des scripts Postgresql
- 8. PDFTK Alternative
- 9. Alternative à GetProcessID pour Windows 2000
- 10. meilleure solution alternative pour ASP.NET AJAX UpdatePanel
- 11. Ruby console alternative pour IRB (Windows)
- 12. Php Javascript alternative pour jquery grid
- 13. Comment modifier une requête SQL pour PostgreSQL?
- 14. Meilleure alternative pour c + ancienne fonctionnalité?
- 15. Une très bonne RichTextBox alternative pour
- 16. Alternative pour C-clé dans Emacs?
- 17. Alternative à FinalBuilder pour Mac OS X?
- 18. Installation PL/Ruby pour PostgreSQL 8.3
- 19. Bonne alternative à GenuineChannels pour .net remoting
- 20. ColdFusion.navigate alternative?
- 21. parseInt alternative
- 22. mosso alternative
- 23. Postgresql/php
- 24. PostgreSQL concaténation
- 25. Alternative pour print_r en php pour iphone (objectif-c)?
- 26. Microsoft alternative à Jabber?
- 27. PostgreSQL Template Subsonic
- 28. Alternative à getElementsByTagName
- 29. Assez alternative à JProgressBar?
- 30. ASP.NET Alternative à Shorty
Grande réponse, je suis passé de la troisième méthode à la première pour des raisons de vitesse. J'utilise python et psycopg2 et l'exécution d'une seule instruction pour l'insertion de données en masse est simplement un moyen plus rapide. Voudrais savoir si le troisième est vraiment plus sûr que le premier? Je pense que le premier et le troisième sont tout aussi sûrs et le second a une condition de concurrence. – Ross