powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Sequence инкрементируется, даже если не произошел INSERT
3 сообщений из 3, страница 1 из 1
Sequence инкрементируется, даже если не произошел INSERT
    #40037368
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица со следующей структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE web.cabinet_account_section (
	id serial NOT NULL,
	section_id text NULL,
	account_id int4 NULL,
	cabinet_param_id int4 NULL,
	CONSTRAINT cabinet_account_section_pkey PRIMARY KEY (id),
	CONSTRAINT cabinet_account_section_section_id_account_id_key UNIQUE (section_id),
	CONSTRAINT cabinet_account_section_account_id_fkey FOREIGN KEY (account_id) REFERENCES web.cabinet_account(id),
	CONSTRAINT cabinet_account_section_cabinet_param_id_fkey FOREIGN KEY (cabinet_param_id) REFERENCES web.cabinet_param(id)
);


Каждый день таблица обновляется. До недавних пор таблица обновлялась следующим образом: если UNIQUE section_id уже существует (т.е. выполняется обычный SELECT EXISTS), то ничего добавлять не нужно. На вход каждый день приходит около 10,000 записей. Т.е. 10,000 запросов и в целом это работало, хоть и не так быстро.

Я решил заменить эту логику на UPSERT. Скрипт выглядит так:
Код: sql
1.
2.
3.
INSERT INTO web.cabinet_account_section (section_id, account_id, cabinet_param_id)
VALUES ('${view.id}', '${account.id}', 2)
ON CONFLICT DO NOTHING;


Но тут возникла небольшая проблема с serial полем. При каждом запросе INSERT INTO, id serial автоматически инкрементируется, даже если запись не была вставлена. Т.е. последний id в колонке условно был = 1800. Вчера в таблице появилось несколько новых записей с такими id: 2300, 2560, 8120, 9982. Сегодня id уже перевалил за 20,000. Т.е. он пытается сделать INSERT, увеличивает счетчик, не осуществляет вставку, но счетчик не откатывается обратно.

Думаю, что через пару месяцев он в конечном итоге упрется в лимит диапазона serial.

Скрипт этой последовательности:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE SEQUENCE web.cabinet_account_id_seq
	INCREMENT BY 1
	MINVALUE 1
	MAXVALUE 2147483647
	START 1
	CACHE 1
	NO CYCLE;


Можно ли как-то починить это дело? Одно дело, когда просто удаляешь запись из таблицы и айдишник какой-то пропадает. Но тут sequence растет в геометрической прогрессии. Либо возвращаться к старому варианту с проверкой на то, существует ли уже такой section_id.
...
Рейтинг: 0 / 0
Sequence инкрементируется, даже если не произошел INSERT
    #40037370
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Sequence инкрементируется, даже если не произошел INSERT
    #40037376
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

сделайте bigserial/bigint и успокойтесь...его вам на всю жизнь хватит

ps: проблема известная и не лечится.
pps: insert on conflict do nothing если в 99% случаев этот do nothing делается - таки антипаттерн и так лучше не делать (проверяйте наличие и если не нашли вставляйте но все равно с insert on conflict do nothing - это будет идеально).


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Sequence инкрементируется, даже если не произошел INSERT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]