Как в 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. Конечно же, такое поле может именоваться по другому.