Как получить id после insert postgresql
Перейти к содержимому

Как получить id после insert postgresql

<rmcreative>

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

Довольно часто требуется получить ID только что вставленной в базу записи. В MySQL это чаще всего решается при помощи LAST_INSERT_ID.

В PostgreSQL можно сделать так:

Комментарии RSS по email OK

сколько раз сталкивался по работе с postgresql, столько раз плевался 🙂 отсутствие нужных, а порой элементарных вещей как в mysql вызывает удивление. а вот в чем прелесть postgresql относительно mysql я так и не понял. возможно я не умею его готовить 😀

Какие, например, нужные вещи отсутствуют?

На php при вставке такого запроса пишет Resource id #10 я вначале подумал что 10 это и есть id но такое показывает при каждом запросе Все пишут об RETURNING id но к php это не имеет никакого отношения? Так как же получить RETURNING id?

Операции с данными

Для добавления данных применяется команда INSERT , которая имеет следующий формальный синтаксис:

После INSERT INTO идет имя таблицы, затем в скобках указываются все столбцы через запятую, в которые надо добавлять данные. И в конце после слова VALUES в скобках перечисляются добавляемые значения.

Допустим, у нас в базе данных есть следующая талица:

Добавим в нее одну строку с помощью команды INSERT:

После удачного выполнения в pgAdmin в поле сообщений должно появиться сообщение «INSERT 0 1»:

INSERT INTO в PostgreSQL

Стоит учитывать, что значения для столбцов в скобках после ключевого слова VALUES передаются по порядку их объявления. Например, в выражении CREATE TABLE выше можно увидеть, что первым столбцом идет Id, поэтому этому столбцу передаетсячисло 1. Второй столбец называется ProductName, поэтому второе значение — строка «Galaxy S9» будет передано именно этому столбцу и так далее. То есть значения передаются столбцам следующим образом:

ProductName: ‘Galaxy S9’

Также при вводе значений можно указать непосредственные столбцы, в которые будут добавляться значения:

Здесь значение указывается только для трех столбцов. Причем теперь значения передаются в порядке следования столбцов:

ProductName: ‘iPhone X’

Для столбца Id значение будет генерироваться автоматически базой данных, так как он представляет тип Serial. То есть к значению из последней строки будет добавляться единица.

Для остальных столбцов будет добавляться значение по умолчанию, если задан атрибут DEFAULT (например, для столбца ProductCount), значение NULL. При этом неуказанные столбцы (за исключением тех, которые имеют тип Serial) должны допускать значение NULL или иметь атрибут DEFAULT.

Если конкретные столбцы не указываются, как в первом примере, тогда мы должны передать значения для всех столбцов в таблице.

Также мы можем добавить сразу несколько строк:

В данном случае в таблицу будут добавлены три строки.

Возвращение значений

Если мы добавляем значения только для части столбцов, то мы можем не знать, какие значения будут у других столбцов. Например, какое значени получит столбец Id у товара. С помощью оператора RETURNING мы можем получить это значение:

pg_last_oid

pg_last_oid() используется для определения OID , соответствующего вставленной в таблицу строке.

Поле OID таблиц баз данных стало необязательным, начиная с версии PostgreSQL 7.2, а с версии 8.1 перестанет добавляться в таблицы по умолчанию. Если поле OID таблицы не задано, используйте функцию pg_result_status() для проверки успешности вставки записей в таблицу.

Чтобы получить значение SERIAL поля после вставки строки в таблицу, используйте функцию PostgreSQL CURRVAL , передав ей имя последовательности, значение которой нужно получить. Чтобы узнать имя последовательности, необходимо использовать функцию pg_get_serial_sequence (PostgreSQL 8.0).

В PostgreSQL 8.1 есть функция LASTVAL , возвращающая значение наиболее часто используемой за сессию последовательности. Так можно избежать необходимость задавать название последовательности, таблицы или колонки.

Замечание:

Прежнее название функции: pg_getlastoid() .

Список параметров

Экземпляр PgSql\Result , возвращаемый функциями pg_query() , pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Целое число ( int ) или строка ( string ), содержащая OID последней вставленной строки на соединении connection , либо false , если произошла ошибка или поле OID недоступно.

Список изменений

Версия Описание
8.1.0 Параметр result теперь ожидает экземпляр PgSql\Result ; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_last_oid()

<?php
// Подключение к базе данных
pg_connect ( «dbname=mark host=localhost» );

// Создание тестовой таблицы
pg_query ( «CREATE TABLE test (a INTEGER) WITH OIDS» );

// Вставка данных в таблицу
$res = pg_query ( «INSERT INTO test VALUES (1)» );

$oid = pg_last_oid ( $res );
?>

Смотрите также

  • pg_query() — Выполняет запрос
  • pg_result_status() — Возвращает состояние результата запроса

User Contributed Notes 6 notes

The way I nuderstand it, each value is emitted by a sequence only ONCE. If you retrieve a number (say 12) from a sequence using nextval(), the sequence will advance and subsequent calls to nextval() will return further numbers (after 12) in the sequence.

This means that if you use nextval() to retrieve a value to use as a primary key, you can be guaranteed that no other calls to nextval() on that sequence will return the same value. No race conditions, no transactions required.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *