Intereting Posts

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)) » для установки уникального ограничения.

См. Частоту PostgreSQL :

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

Это невозможно легко устранить без существенного снижения производительности. Для получения дополнительной информации см. «Бесполезные последовательности для первичных ключей » Элеина Мустеина в бюллетене «Общие биты».

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

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

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