выдержки из официального фака
Как мне получить значение при вставке SERIAL?
Один из способов состоит в получении следующего значения SERIAL из объекта sequence с помощью функции nextval() перед вставкой и затем вставлять это значение явно. Используйте таблицу-пример в 4.11.1, пример в псевдоязыке покажет как это делается:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Затем вы должны также сохранить новое значение в переменной new_id для его использования в других запросах (например таких как внешний ключ для таблицы person). Заметим, что имя автоматически созданного объекта SEQUENCE будет
__seq, где table и serialcolumn являются соответственно именами вашей таблицы и вашей колонки SERIAL.
В качестве альтернативы, вы можете получить назначенное значение SERIAL с помощью функции currval() после проведения обычной операции вставки, например
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
Не может ли получиться так, что использование currval() и nextval() приведет к зациклированию с другими пользователями?
Нет. currval() возвращает текущее значение, назначенное вашей сессией, а не другими сессиями.