This Might Be Useful

Переход с MySQL на PostgreSQL: аналог mysql_insert_id()

На работе пришлось перейти с привычного MySQL на PostgreSQL, с которым я раньше почти не работал. Сразу возникло сравнительно много вопросов. Среди них - срочный: как получить id только что вставленной строчки (т.е. понадобился аналог mysql_insert_id()). Понятно, что последующий select по некоторым признакам - плохая идея. Поэтому был найден хороший путь.

Для генерации id у меня, понятное дело, используется sequence (т.е. тип поля id - serial или bigserial). И оказалось, что новое значение id можно получить таким запросом:

SQL:
  1. SELECT currval('название_sequence');

Такой запрос выдаст последнее значение, выбранное из последовательности название_sequence функцией nextval() в текущем соединении с базой. В разных, пусть даже одновременно работающих, скриптах эта функция будет возвращать разные значения. Если же в текущем соединении функция nextval('название_sequence') не выполнялась, то currval('название_sequence') вернет ошибку.

В версии 8.1 была добавлена функция lastval(), которая вернет последнее значение, выбранное функцией nextval() в текущем соединении.

Кроме того, есть ситуации, когда неизвестно название sequence (или его лень писать или смотреть, например ;)). Тогда можно написать так (работать это будет начиная с PostgreSQL 8.0):

SQL:
  1. SELECT currval(pg_get_serial_sequence('таблица', 'id_поле'));

· Распределение SQL-запросов между серверами в кластере
· Включаем звук в Benq S52 (Conexant CX20551, ICH6 Family)
· Основы масштабирования (web-проектов)

- Коментировать
- Trackback

Leave a Reply