Postgresql неправильное автоинкремент для серийного номера

У меня проблема с postgresql, я думаю, что в postgresql есть ошибка, я что-то неправильно реализую.

Есть таблица, включающая colmn1(primary key), colmn2(unique), colmn3, ...

После вставки строки, если я попробую еще одну вставку с существующим значением colmn2, я получаю ошибку повторяющегося значения, как я и ожидал. Но после этой неудачной попытки следующее значение colmn1 увеличивается на 1, хотя вставки нет, поэтому я получаю строки с последовательностями идентификаторов, например, 1,2,4,6,9.(3,5,6,7,8 идет для неудачных испытаний).

Мне нужна помощь тех, кто может объяснить это странное поведение.

Эта информация может быть полезной: я использовал запрос «create unique index on tableName (lower(column1))», чтобы установить уникальное ограничение.


person woryzower    schedule 14.09.2012    source источник


Ответы (2)


См. часто задаваемые вопросы о последовательности PostgreSQL:

Последовательности предназначены для генерации уникальных идентификаторов - не обязательно идентификаторов, которые являются строго последовательными. Если два одновременно работающих клиента базы данных попытаются получить значение из последовательности (используя nextval ()), каждый клиент получит другое значение последовательности. Если один из этих клиентов впоследствии прерывает свою транзакцию, значение последовательности, сгенерированное для этого клиента, не будет использоваться, создавая разрыв в последовательности.

Это не может быть легко исправлено без значительного снижения производительности. Для получения дополнительной информации см. "Непрерывные последовательности для первичных ключей" Элейн Мустейн в информационном бюллетене General Bits.

person Sjoerd    schedule 14.09.2012

Из руководства:

Важно: поскольку последовательности не являются транзакционными, изменения, внесенные setval, не отменяются при откате транзакции.

Другими словами, иметь пробелы - это нормально. Если вы не хотите пропусков, не используйте последовательность.

person Frank Heikens    schedule 14.09.2012