powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему SERIAL делает пропуски
12 сообщений из 12, страница 1 из 1
Почему SERIAL делает пропуски
    #32966246
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Научите, пожалуйста, почему после удаления строк и вставке новых поле SERIAL пропускает значения (те которые были удалены)

Можно ли как-нибудь этого избежать?

Спасибо!
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32966351
Vlado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Избежать можно.
Но дизайнтайма разработчика и рантайма сервера оно не стоит.
Так что не бери в голову :)
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32966803
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERIAL это сиквенс который создается и убивается(при смерти колонки/таблицы) автоматом... интересно как ты себе представляеш реализацию такого сериала(с отсуствием пропусков) когда в таблице например насколько милионов строк и она безконца обновляется
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32966912
Vlado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вопрос ко мне, то готов набросать несколько слов по-русски,
но на SQL - не вижу смысла реально захламлять сервер, хотя там нет ничего сложного.
Поле с автоинкрементом предназначено лишь для генерации УНИКАЛЬНЫХ значений с МИНИМАЛЬНЫМИ
затратами и НЕ предназначено для генерации натурального ряда БЕЗ ПРОПУСКОВ.
Стараюсь использовать инструменты по назначению.
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32967497
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос был риторический и к автору темы :)
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32967867
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа.
Прокатит ли такой вариант: все вставки в таблицу делать при уровне изоляции Serializable, значение сиквенса получать в тригере, если произойдёт ошибка, то устанавливать значение сиквенса на единицу назад?
Изврат, конечно, но ничего другого не придумалось.
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32968209
Vlado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сомневаюсь.
Ладно, извраты так извраты, если кому надо (мне нет).

Создать дополнительную таблицу, в которую триггером вставлять удаленные значения id основной таблицы.
Дефолтом для id-поля основной таблицы сделать функцию, которая возвращает минимальное
значение этой доп. таблицы и одновременно удаляет мин. запись из этой таблицы.
Если доп. таблица пустая, возвращать nextval определенного заранее сиквенса.
Если происходит массовое удаление записей из основной таблицы,
можно предусмотреть периодическую обработку, которая апдейтит id-поле
основной таблицы в порядке убывания значениями из доп. таблицы, очищает доп. таблицу
и наконец устанавливает значение сиквенса равным максимальному основной таблицы.

Если учесть, что сплошная нумерация элементарно делается на клиенте,
то ИМХО это нах никому не надо.
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32968212
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!

Я просто думал, что это не сложно.
Как например вставлять в INTEGER поле (SELECT max(field_name) FROM table) +1
Понимаю, что это совсем не эфективно
Думал есть чего-то красивее.

А если так, то пусть пропускает :-!
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32968236
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
операции прев_вал нету т.е на единицу меньше это $a = cur_val set_val($a-1);
cur_val -локальный в сесии.. у тебя курвал может быть 10 а на самом деле сиквенс уже за 100 перешел в других сесиях..

, и потом тригер относительно некст_вала не атомарная операция, грубоговоря.. между твоим нексвалом в тригере и ролбаком может произойит еще несколько некствалов от других сесий..

next_val атомарная необратимая операция.. ей насрать какой у тебя уровень изолированости.. она призванна обеспечивать уникальность.. ручное выставление сиквенса через set_val черевато глюками..особенно в такой ситуации
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32968272
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В триггерную ф-ю пишешь по-типа:

SELECT setval('public.plots_plid_seq',
(SELECT CASE WHEN MAX(plid) IS NULL
THEN 1
ELSE MAX(plid) end
FROM plots),
(SELECT CASE WHEN MAX(plid) IS NULL
THEN False
ELSE True end
FROM plots)
);
И вызываешь на DELETE /UPDATE (но не инсерт). Если скучно. А то я такие вещи делаю только после частичного влива данных "руками". (Если че-нть починять приходится). Чтобы не напороться на ошибку при попытке вставки дубля в ключевое поле.

Вообше-то счетчик, генерящий уникумы для всех сеансов для того и придуман, чтобы не лезть за данными, не разбираться с транзакциями, а лепить последовательность автоматом (т.е. наибыстрейшим способом). Если кто-то отказался от вставки - пропуск на его совести. Для сплошной перенумерации в оформительских целях можно использовать другие приемы.
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32968844
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К 4321:

Наверное лучше трудно придумать.
Спасибо!

А вот это "Для сплошной перенумерации в оформительских целях можно использовать другие приемы" меня очень заинтересовало.

Не поделитесь такими приёмами?

Спасибо!
...
Рейтинг: 0 / 0
Почему SERIAL делает пропуски
    #32969084
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor KozlovК 4321:

Не поделитесь такими приёмами?


оформление - это не SQL, а еще где-то (некая морда) Вот там заводите свои мордатые переменные, и инкрементируете их по своему желанию.




ЗЫ. есть и "чиста ссыкульные" приемы - скорее упражнения для любящих стоячие лыжные упражнения с утяжелением в гамаке. Т.к. "чиста SQL" не предполагает упорядочивания данных, по крайней мере до применения ORDER BY. Приемы найдете в статьях на сайте (хотя для постгреса, наверное, можно напридумывать свои разновидности). Воспользуйтесь поиском.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему SERIAL делает пропуски
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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