Почему последовательности идентификаторов SQL не синхронизированы (особенно с использованием Postgres)? - PullRequest
8 голосов
/ 16 февраля 2012

Я видел решения для обновления последовательности, когда она не синхронизируется с первичным ключом, который она генерирует, но я не понимаю, как эта проблема возникает в первую очередь.

Кто-нибудь знает, как поле первичного ключа с его значением по умолчанию, определенным как nextval последовательности, первичные ключи которого нигде не установлены явно, может не синхронизироваться с последовательностью?Я использую Postgres, и мы видим, что это происходит время от времени.В конечном итоге это приводит к ограничению повторяющегося ключа, когда последовательность создает идентификатор для существующей строки.

Ответы [ 2 ]

9 голосов
/ 17 февраля 2012

Ваше приложение, вероятно, иногда устанавливает значение первичного ключа для новой строки.Тогда postgresql не нужно получать новую последовательность, и последовательность не обновляется.

0 голосов
/ 17 февраля 2012

Когда порядковый номер выделен, он остается выделенным, даже если TX, который запросил его, откатывается. Таким образом, может быть выделено число, которое не отображается в стабильной базе данных. Конечно, строки также могут быть удалены после их создания, поэтому максимальное количество, найденное в таблице, не обязательно должно быть максимальным количеством, когда-либо выделенным. Это относится к любому типу автоинкремента.

Кроме того, в зависимости от используемой технологии, отдельные последовательности могут использоваться с несколькими таблицами, поэтому значение может отсутствовать в таблице A, но присутствовать в таблице B. Это может произойти из-за ошибки в использовании имен последовательностей или может быть преднамеренным.

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