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

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

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

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

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

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

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

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

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

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
18.03.2005, 16:59
    #32968844
Igor Kozlov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему SERIAL делает пропуски
К 4321:

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

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

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

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

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


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




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


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