PostgreSQL-следующее серийное значение в таблице
У меня простой вопрос, предположим у нас есть таблица:
id A B
1 Jon Doe
2 Foo Bar
есть ли способ узнать, что является следующим шагом id, в этом случае 3 ? База данных PostgreSQL!
Tnx много!
3 ответов
если вы хотите получить идентификатор и вернуть его, вы можете использовать nextval()
, который продвигает последовательность без вставки каких-либо данных.
обратите внимание, что если это SERIAL
столбец, вам нужно найти имя последовательности, основанное на имени таблицы и столбца, следующим образом:
Select nextval(pg_get_serial_sequence('my_table', 'id')) as new_id;
нет чугунной гарантии, что вы увидите, что эти идентификаторы вернутся по порядку (последовательность генерирует их по порядку, но несколько сеансов могут претендовать на идентификатор и еще не использовать его или свернуть назад!--3--> и идентификатор не будет использоваться повторно), но есть гарантия того, что они будут уникальными, что обычно является важным.
если вы делаете это часто, фактически не используя ID, вы в конечном итоге будете использовать все возможные значения 32-битного integer
столбец (т. е. достигает максимального представимого целого числа), но если вы используете его только тогда, когда есть высокая вероятность, что вы фактически вставите строку с этим идентификатором, это должно быть нормально.
для получения настоящее значение последовательности, не затрагивая его или не нуждаясь в предыдущей вставке в том же сеансе, вы можете использовать;
SELECT last_value FROM tablename_fieldname_seq;
конечно, получение текущего значения не гарантирует, что следующее значение, которое вы получите, на самом деле last_value + 1
если есть другие одновременные сеансы, выполняющие вставки, так как другой сеанс, возможно, принял последовательное значение перед вами.
SELECT currval('names_id_seq') + 1;
посмотреть docs
однако, конечно, нет никакой гарантии, что это будет код следующее значение. Что если другой клиент схватит его раньше тебя? Вы можете зарезервировать одно из следующих значений для себя, выбрав nextval
из последовательности.