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

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

  • автор:

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

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

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

INSERT INTO "Post"( title, text ) VALUES ( 'Я заголовок', 'Я текст' ) RETURNING id

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

Dr.Death 07 авг. 2009 г., 13:54:10

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

Sam 07 авг. 2009 г., 14:54:28
Какие, например, нужные вещи отсутствуют?
Виктор 19 апр. 2017 г., 6:33:33

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

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

Иногда бывает полезно получать данные из модифицируемых строк в процессе их обработки. Это возможно с использованием предложения RETURNING , которое можно задать для команд INSERT , UPDATE и DELETE . Применение RETURNING позволяет обойтись без дополнительного запроса к базе для сбора данных и это особенно ценно, когда как-то иначе трудно получить изменённые строки надёжным образом.

В предложении RETURNING допускается то же содержимое, что и в выходном списке команды SELECT (см. Раздел 7.3). Оно может содержать имена столбцов целевой таблицы команды или значения выражений с этими столбцами. Также часто применяется краткая запись RETURNING * , выбирающая все столбцы целевой таблицы по порядку.

В команде INSERT данные, выдаваемые в RETURNING , образуются из строки в том виде, в каком она была вставлена. Это не очень полезно при простом добавлении, так как в результате будут получены те же данные, что были переданы клиентом. Но это может быть очень удобно при использовании вычисляемых значений по умолчанию. Например, если в таблице есть столбец serial , в котором генерируются уникальные идентификаторы, команда RETURNING может возвратить идентификатор, назначенный новой строке:

CREATE TABLE users (firstname text, lastname text, id serial primary key); INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

Предложение RETURNING также очень полезно с INSERT . SELECT .

В команде UPDATE данные, выдаваемые в RETURNING , образуются новым содержимым изменённой строки. Например:

UPDATE products SET price = price * 1.10 WHERE price 

В команде DELETE данные, выдаваемые в RETURNING , образуются содержимым удалённой строки. Например:

DELETE FROM products WHERE obsoletion_date = 'today' RETURNING *;

Если для целевой таблицы заданы триггеры (см. Главу 36), в RETURNING выдаются данные из строки, изменённой триггерами. Таким образом, RETURNING часто применяется и для того, чтобы проверить содержимое столбцов, изменяемых триггерами.

Пред. Наверх След.
6.3. Удаление данных Начало Глава 7. Запросы

Практическое применение RETURNING¶

После добавления строки в таблицу часто бывает нужно получить сгенерированный СУБД уникальный идентификатор этой строки (ID) или значение любого поля, которое имеет значение по умолчанию.

К примеру, имеется таблица клиентов

CREATE TABLE clients( id serial PRIMARY KEY, -- строка эквивалентна id int DEFAULT nextval('clients_id_seq') PRIMARY KEY name varchar NOT NULL ); 

Значение поля ID формируется СУБД автоматически, если оно не задано явно. Для нумерации клиентов используется последовательность clients_id_seq. Поэтому при создании нового клиента без явного указания его идентификатора новое значение ID будет сформировано запросом

SELECT nextval('clients_id_seq') 

Таким образом запрос

INSERT INTO clients(name) VALUES('Denis'); 

реально трансформируется в запрос

INSERT INTO clients(id, name) VALUES(nextval('clients_id_seq'), 'Denis'); 

Если нужно получить автоматически сгенерированный ID, то у разработчиков есть два стандартных варианта:

    Явно получить новый ID и вставить его в запрос

_new_id := nextval('clients_id_seq'); INSERT INTO clients(id, name) VALUES(_new_id, 'Denis'); 
INSERT INTO clients(name) VALUES(nextval('Denis'); _new_id := currval('clients_id_seq'); 

Оба варианта используют два запроса для одной бизнес-операции.

Но можно обойтись одним запросом, использовав RETURNING

db=# INSERT INTO clients(name) VALUES('Denis') RETURNING id; id ------- 10001 (1 row) 

В этом случае запрос создаст нового клиента и в качестве результата вернет его ID.

Возвращать измененные значение полей может и UPDATE. Классический пример с изменение баланса счета в банке - надо уменьшить баланс клиента на 100.

Запрос будет таким.

UPDATE accounts SET balance = balance - 100 WHERE id = _id; 

Чтобы получить обновленный баланс, надо сделать второй запрос

SELECT balance FROM accounts WHERE id = _id; 

Если эти два запроса делать в различных транзакция или без соответствующих блокировок, то это может привести к беде - баланс клиента не будет соответствовать действительности из-за возможных конкурентных параллельных изменений одной и той же записи. Для предотвращения подобных случаев удобно использовать RETURNING. Запрос будет таким

db=# UPDATE accounts SET balance = balance - 100 WHERE id = _id RETURNING balance; balance ----------- 200.5 (1 row) 

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

Поэтому RETURNING может не только уменьшить количество запросов к базе, но и сократить количество потенциальных проблем при обработке данных.

RETURNING может возвращать не только данные одной строки, но и все измененные/обработанные строки для UPDATE и DELETE.

Пример, когда RETURNING возвращает список удаленных записей.

db=# DELETE FROM customers RETURNING *; id | name ------+-------- 1950 | Hana 2709 | Maritza 9192 | Miya 6437 | Jamil . 

Пользуйтесь с удовольствием!

Получение id добавленной записи в PostgeSQL

Каким бы супер-пупер спецом вы не были — в процессе разработки эпизодически попадаются интересные и удобные вещи о которых, казалось бы, давно бы пора знать, но все никак не складывалось. Этакий ништячок, найдя который хочется воскликнуть: «Эврика!». Вот таким ништячком для меня стал элемент синтаксиса INSERT в PostgreSQL, которым я и хочу поделиться с вами.

Ситуация: После добавления записи в базу нужно получить id этой самой свеже-вставленной записи.
Решение на PostgreSQL: INSERT… RETURNING id где id — это PRIMARY_KEY в таблице.

Просто и элегантно, не правда ли?

Подробный пример:

postgres=# create table test (id serial,name text);
NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"
CREATE TABLE
postgres=# INSERT INTO test (name) VALUES ('My Name') RETURNING id;
id
----
1
postgres=# INSERT INTO test (name) VALUES ('My Name 1') RETURNING id;
id
----
2
(1 row)

  • postrgres
  • postgreSQL
  • last insert id

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

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