mysql_insert_id альтернатива postgresql

есть ли альтернатива для функции mysql_insert_id() php для PostgreSQL? Большинство фреймворков частично решают проблему путем нахождения текущего значения последовательности, используемой в ID. Однако есть моменты, когда первичный ключ не является последовательным столбцом ….

Related of "mysql_insert_id альтернатива postgresql"

С точки зрения 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. OIDs по умолчанию отключены после PostgreSQL 8.1.

Таким образом, в зависимости от того, какая версия PostgreSQL у вас есть, вы должны выбрать один из вышеуказанных методов. В идеале, конечно, используйте библиотеку абстракции базы данных, которая абстрагирует это выше. В противном случае код низкого уровня выглядит так:

Метод первый: INSERT … RETURNING

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

Второй способ: 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]; 

Третий метод: 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. Однако большинство библиотек абстракции db еще не используют первый метод.

Ознакомьтесь с необязательным предложением RETURNING для инструкции INSERT. (Ссылка на официальную документацию PostgreSQL)

Но в основном, вы делаете:

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

и сам оператор INSERT возвращает идентификатор (или любое другое выражение) указанной строки.

От 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')"); 

Это всегда должно обеспечивать уникальный ключ, поскольку ключ, полученный из базы данных, никогда не будет восстановлен снова.

Вы также можете использовать:

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

Вы должны указать в pg_fetch_result номер строки и имя поля, которое вы ищете, это более точный способ получить нужные вам данные, но я не знаю, имеет ли это какое-то наказание в производительность запроса. Помните, что этот метод предназначен для PostgreSQL версии 8.2 и выше.