Как в PHP получить ID вставленной записи в PostgreSQL

В языке PHP при работе с MySQL обычно используют функцию mysql_insert_id() для извлечения id вставленой записи. При первом использовании PostgreSQL может возникнуть вопрос — а как сделать такое же, и где аналогичная функция? Ее нет. Потому что в PostgreSQL предусмотрена другая возможность извлечения id — это команда RETURNING в языке SQL, и добавляется она в конце запроса INSERT:

INSERT INTO table1(fname, surname) VALUES('Иван', 'Иванов') RETURNING id;

такой запрос возвращает результат в виде таблицы с полем id и с его значением. Т.е. на PHP чтобы сохранить id в переменную, пишем так, как обычно делаем с выборкой данных:

$query = "INSERT INTO table1(fname, surname) VALUES('Иван', 'Иванов') RETURNING id;";
$result = pg_query($query);
$row = pg_fetch_assoc($result);
echo $row['id'];

Такой способ совершенно не оставляет опасений, что во время работы скрипта может быть искажено значение id, так как значение это возвращается непосредственно с запроса INSERT.

Еще одна особенность такого способа – при вставке множества данных в одном запросе, такая команда возвратит все вставленые id.  Из результата мы можем извлечь максимальное значение или же использовать весь список:

$query = "INSERT INTO table1(fname, surname) VALUES('Иван', 'Иванов'),('Петр', 'Петров') RETURNING id;";
$result = pg_query($query);
$n = pg_num_rows($result);
for($i = 0; $i < $n; $i++) {
    $row = pg_fetch_assoc($result);
    echo $row['id'];
}

Отсюда ответ на вопрос — почему нет аналогичной функции: потому что такая функция совершенно не нужна. Просто берем результат выполнения INSERT с командой RETURNING id, и извлекаем из него id точно так же, как мы извлекаем данные после SELECT.

P.S. В статье предполагается что первичный ключ с автоинкрементом имеет поле с именем id. Конечно же, такое поле может именоваться по другому.