С точки зрения PostgreSQL, в псевдокоде:
* $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()
работает только там, где у вас есть OID. OID по умолчанию отключены с PostgreSQL 8.1.
Итак, в зависимости от того, какая у вас версия PostgreSQL, вам следует выбрать один из описанных выше методов. В идеале, конечно, используйте библиотеку абстракций базы данных, которая абстрагируется от вышеупомянутого. В противном случае в низкоуровневом коде это выглядит так:
Метод первый: ВСТАВИТЬ ... ВОЗВРАТ
// 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];
Метод два: ВСТАВИТЬ; 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];
Метод третий: nextval (); ВСТАВИТЬ
$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);");
Самая безопасная ставка - третий способ, но он громоздкий. Первый - самый чистый, но вам нужно запустить последнюю версию PostgreSQL. Однако большинство библиотек абстракции БД еще не используют первый метод.