|
|
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
Допустим в базе данных есть 1000 записей идущий по порядку Потом удаляются две записи допустим с номерами ид 756 и 837 И потом при первой записи в БД нужно присвоить ей номер 756 Как вообще такое можно сделать на postgres ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 15:58:50 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
trom, а как не авторна postgres ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 17:26:51 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
trom, способов масса, но все они -не быстрые, так как предполагают просмотр всех записей. А так, можно даже на банальных [NOT] EXISTS подзапросах такое реализовать... Ведь по факту, тебе нужно выбрать минимальное значение, для которого не существует в таблице значения, больше на единицу. И вернуть его, не забыв ту самую единицу прибавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 17:29:47 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Ну в общем лучший способ это просто выбрать все записи из БД и перебрать их в цикле найти не занятый ИД. Это правда к постгрес не имеет отношения. Правильно все понял ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 17:46:28 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
trom, пометить запись как удаленную. UPDATE tbl SET val = newval WHERE id = (SELECT id FROM tbl WHERE isdeleted IS true LIMIT 1) RETURNING id Если Affected = 0, делаем INSERT. И лучше подумать, действительно это нужно или можно как ни будь без этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 18:47:09 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
trom, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 19:07:25 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
trom, весь вопрос, что у вас с гонками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 19:32:40 |
|
||
|
Как записать в базу первый свободный номер из заданного промежутка
|
|||
|---|---|---|---|
|
#18+
tromДобрый Э - Эх, Ну в общем лучший способ это просто выбрать все записи из БД и перебрать их в цикле найти не занятый ИД. Это правда к постгрес не имеет отношения. Правильно все понял ? Для маленьких баз раком боком но сойдет. Для больших нет. 1. Какая частота удалений 2. Как интенсивность вставок 3. Какой размер таблиц 4. Есть ли индекс по "номерам"? Для больших таблиц, пользовался бы подходом "исключения", т.е свободный "номер" хранил бы в отдельной таблице, занося их после удаления с основной и выбирая с ней при вставке новых в основную. Преимущества: 1. При обращение к дочерней таблице можно быстро проверить есть ли свободные номер в основной, на основании это можно переключать логику "используем свободный / добавляем новый" 2. Самое главное, отпадает SELECT к основной таблице. Не нужно нечего проверять в ней. 3. Накладывая индекс на дочернюю таблицу на идентификатор основной (если их несколько), использование UNLOGGED для нее - позволит операции выполнять максимальное быстро. И можно оставить в покое основную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 20:23:03 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38498778&tid=1998942]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
269ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 628ms |

| 0 / 0 |
