Переход с MySQL на PostgreSQL: аналог mysql_insert_id()
На работе пришлось перейти с привычного MySQL на PostgreSQL, с которым я раньше почти не работал. Сразу возникло сравнительно много вопросов. Среди них - срочный: как получить id только что вставленной строчки (т.е. понадобился аналог mysql_insert_id()). Понятно, что последующий select по некоторым признакам - плохая идея. Поэтому был найден хороший путь.
Для генерации id у меня, понятное дело, используется sequence (т.е. тип поля id - serial или bigserial). И оказалось, что новое значение id можно получить таким запросом:
-
SELECT currval('название_sequence');
Такой запрос выдаст последнее значение, выбранное из последовательности название_sequence функцией nextval() в текущем соединении с базой. В разных, пусть даже одновременно работающих, скриптах эта функция будет возвращать разные значения. Если же в текущем соединении функция nextval('название_sequence') не выполнялась, то currval('название_sequence') вернет ошибку.
В версии 8.1 была добавлена функция lastval(), которая вернет последнее значение, выбранное функцией nextval() в текущем соединении.
Кроме того, есть ситуации, когда неизвестно название sequence (или его лень писать или смотреть, например ;)). Тогда можно написать так (работать это будет начиная с PostgreSQL 8.0):
-
SELECT currval(pg_get_serial_sequence('таблица', 'id_поле'));

