вопрос относительно последовательностей postgresql - PullRequest
0 голосов
/ 21 июня 2010

У меня есть вопрос, касающийся последовательностей postgresql.

Например, для bigserial datatype действительно ли последовательность является расширенной, затем извлекается число, и даже если вставка / фиксация не удалась,последовательность не возвращается.Это означает, что в следующий раз, когда я буду выполнять вставку в таблицу, это может быть пробел в порядковом номере.

В моей таблице есть триггер до вставки строки, и я использую psycopg2.

заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 21 июня 2010

, даже если вставка / фиксация не удалось, последовательность не откатывается. Это означает, что в следующий раз, когда я буду делать вставку в таблицу, это может быть пробел в порядковом номере.

Да, это правда, и это нормально. Обычно требуется, чтобы последовательность получала значения в таблице, которые являются уникальными (обычно для PK) и промежутки не имеют значения вообще.

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

Кстати: если вам нужна последовательность «без пропусков» ... сначала спросите себя, действительно ли вы этого хотите (обычно вы действительно этого не хотите - и требование этого часто указывает на концептуальную проблему в вашем дизайне) ... но если вам это действительно нужно, вы можете прочитать это .

3 голосов
/ 21 июня 2010

Для возврата требуется блокировка до завершения.Это было бы плохо, особенно если все 10 таблиц могут использовать одну и ту же последовательность.Если вы хотите, чтобы заказ не использовал последовательность, используйте оконную функцию, такую ​​как row_number () .

...