powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как записать в базу первый свободный номер из заданного промежутка
9 сообщений из 9, страница 1 из 1
Как записать в базу первый свободный номер из заданного промежутка
    #38498778
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим в базе данных есть 1000 записей идущий по порядку
Потом удаляются две записи допустим с номерами ид 756 и 837

И потом при первой записи в БД нужно присвоить ей номер 756

Как вообще такое можно сделать на postgres ?
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38498972
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

а как не

авторна postgres

?
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38498977
trom,

способов масса, но все они -не быстрые, так как предполагают просмотр всех записей.

А так, можно даже на банальных [NOT] EXISTS подзапросах такое реализовать...

Ведь по факту, тебе нужно выбрать минимальное значение, для которого не существует в таблице значения, больше на единицу. И вернуть его, не забыв ту самую единицу прибавить
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38499012
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Ну в общем лучший способ это просто выбрать все записи из БД и перебрать их в цикле найти не занятый ИД.
Это правда к постгрес не имеет отношения.
Правильно все понял ?
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38499104
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,
пометить запись как удаленную.
UPDATE tbl SET val = newval WHERE id = (SELECT id FROM tbl WHERE isdeleted IS true LIMIT 1) RETURNING id
Если Affected = 0, делаем INSERT.
И лучше подумать, действительно это нужно или можно как ни будь без этого.
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38499127
marvinorez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
trom,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table trash.test_data (id int, data text);

insert into trash.test_data 
select i, 'data '||i from generate_series(1, 1000000) i;

delete from trash.test_data where id = any(values(756), (837))


select v.rank as first_deleted_id
from
(
        select id, row_number() over (order by id asc) as rank
        from trash.test_data
) v
where v.id != v.rank
limit 1
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38499149
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

весь вопрос, что у вас с гонками?
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38500559
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tromДобрый Э - Эх,

Ну в общем лучший способ это просто выбрать все записи из БД и перебрать их в цикле найти не занятый ИД.
Это правда к постгрес не имеет отношения.
Правильно все понял ?
Для маленьких баз раком боком но сойдет. Для больших нет.
1. Какая частота удалений
2. Как интенсивность вставок
3. Какой размер таблиц
4. Есть ли индекс по "номерам"?

Для больших таблиц, пользовался бы подходом "исключения", т.е свободный "номер" хранил бы в отдельной таблице, занося их после удаления с основной и выбирая с ней при вставке новых в основную.
Преимущества:
1. При обращение к дочерней таблице можно быстро проверить есть ли свободные номер в основной, на основании это можно переключать логику "используем свободный / добавляем новый"
2. Самое главное, отпадает SELECT к основной таблице. Не нужно нечего проверять в ней.
3. Накладывая индекс на дочернюю таблицу на идентификатор основной (если их несколько), использование UNLOGGED для нее - позволит операции выполнять максимальное быстро.

И можно оставить в покое основную таблицу.
...
Рейтинг: 0 / 0
Как записать в базу первый свободный номер из заданного промежутка
    #38500811
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Electric200,

Спасибо идея с дополнительной таблицей со свободными номерами мне больше всего подходит!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как записать в базу первый свободный номер из заданного промежутка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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