sql >> Databasteknik >  >> RDS >> PostgreSQL

mysql_insert_id alternativ för postgresql

Ur PostgreSQL-synpunkt, i pseudokod:

 * $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() fungerar bara där du har OID. OID har varit avstängt som standard sedan PostgreSQL 8.1.

Så, beroende på vilken PostgreSQL-version du har, bör du välja en av ovanstående metoder. Helst, naturligtvis, använd ett databasabstraktionsbibliotek som abstraherar bort ovanstående. Annars, i lågnivåkod, ser det ut så här:

Metod ett:INFOGA... RETURNERAR

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

Metod två: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];

Metod tre:nextval(); INFOGA

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

Det säkraste alternativet skulle vara den tredje metoden, men den är svårhanterlig. Den renaste är den första, men du måste köra en ny PostgreSQL. De flesta db abstraktionsbibliotek använder dock inte den första metoden ännu.



  1. NLS_UPPER() Funktion i Oracle

  2. Bifoga ett innehållsdokument till ett anpassat Salesforce-objekt

  3. Array i IN()-satsen oracle PLSQL

  4. Hur CHARACTER_LENGTH()-funktionen fungerar i MySQL