Вопрос

есть ли альтернатива для mysql_insert_id() php для 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.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];

Способ второй:ВСТАВЛЯТЬ;Ластвал()

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

Способ третий:следующийвал();ВСТАВЛЯТЬ

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

Другие советы

Проверьте 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 и выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top