sql >> Databáze >  >> RDS >> PostgreSQL

mysql_insert_id alternativa pro postgresql

Z pohledu PostgreSQL v pseudokódu:

 * $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() funguje pouze tam, kde máte OID. OID jsou od PostgreSQL 8.1 ve výchozím nastavení vypnutá.

Takže v závislosti na verzi PostgreSQL, kterou máte, byste měli vybrat jednu z výše uvedených metod. V ideálním případě samozřejmě použijte knihovnu abstrakce databáze, která abstrahuje výše uvedené. Jinak to v kódu nízké úrovně vypadá takto:

Metoda jedna:VLOŽIT... VRACÍ SE

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

Metoda 2: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];

Metoda tři:nextval(); INSERT

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

Nejbezpečnější sázkou by byla třetí metoda, ale ta je nepraktická. Nejčistší je první, ale budete muset spustit nejnovější PostgreSQL. Většina knihoven abstrakce db však zatím první metodu nepoužívá.



  1. Jak získat vstup od uživatele za běhu

  2. jak používat datový typ Blob v Postgresu

  3. ETL vs ELT:Posuzujeme, vy soudce

  4. Vyhledání sloupce rozdělení pro tabulku oddílů na serveru SQL Server (T-SQL)