Последовательное пропускание числа пропуска - PullRequest
0 голосов
/ 06 декабря 2018
ID | info
---------
1  | xxx
2  | xxx
4  | xxx

У меня есть настройки, подобные этой в PostgreSQL.(Я использую mac под управлением Mojave , если это имеет значение).

У меня есть еще несколько столбцов, но проблема заключается в столбце ID.Это было установлено, чтобы быть последовательным, поэтому с помощью Express я вставляю в БД.

Проблема в том, что он увеличивает ID на каждой вставке даже при неудачной вставке.info определяется unique, поэтому попытка вставить существующий info возвращает ошибку.Но ID все еще увеличивается.

Например, если я вставлю 2 строки, у меня будет id 1 & id 2.Тогда другой, который терпит неудачу с уникальным нарушением.Следующая успешная вставка получает id = 4, пропуская id = 3.

Можно ли настроить Postgres, чтобы он не увеличивался при неудачных вставках?

1 Ответ

0 голосов
/ 06 декабря 2018
Столбцы

serial или IDENTITY (Postgres 10 или более поздние) рисуют числа из SEQUENCE, и следует ожидать пробелов в серийных номерах.Их задача состоит в том, чтобы сделать возможным одновременный доступ к записи с уникальными номерами - , а не обязательно без пробелов.

Если у вас на самом деле нет одновременного доступа к записи , естьПростые способы достижения (в основном) без пробелов чисел.Например:

INSERT INTO tbl (info) 
SELECT 'xxx'
WHERE NOT EXISTS (SELECT FROM tbl WHERE info = 'xxx');

Это не записывает серийный идентификатор из SEQUENCE, потому что дублирующая вставка пропускается.(INSERT может все еще не работать по любой другой причине - и записать серийный номер. Вы могли бы сбросить SEQUENCE в таком случае:

При вставке нескольких строк в одном операторе вы также должны исключить дубликаты в вставленный набор Пример кода:

Но , если у вас естьПараллельные записи , в принципе ничего из вышеперечисленного не работает надежно. Вам лучше научиться принимать пропуски в идентификаторах. У вас всегда может быть запрос с row_number() OVER (ORDER BY id) для генерации чисел без пропусков после факта. Однако числа все еще остаютсяпроизвольно до некоторой степени. Не обязательно означает, что более низкие числа были зафиксированы ранее. Существуют исключения при одновременной загрузке записи. Связано:

Или вместо этого используйте UUID(тип данных uuid) и избегайте внутренней проблемы дубликатов со случайными значениями в огромном пространстве клавиш.Совсем нет serial , хотя:

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