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

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

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

а как не

авторна postgres

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

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

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

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

Ну в общем лучший способ это просто выбрать все записи из БД и перебрать их в цикле найти не занятый ИД.
Это правда к постгрес не имеет отношения.
Правильно все понял ?
...
Рейтинг: 0 / 0
12.12.2013, 18:47:09
    #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
12.12.2013, 19:07:25
    #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
12.12.2013, 19:32:40
    #38499149
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как записать в базу первый свободный номер из заданного промежутка
trom,

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

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

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

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

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


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