бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 18:12
Оценка:
После удаления строк, во множестве значений автоинкрементных первичных ключей idx записей появляются "дырки":
idx data
1   abc
15  sdf
18  dfg


помогите устранить дырки в поле idx и получить такую таблицу
idx 
1  abc
2  sdf
3  dfg


P.S. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.
sql
Re: бездырочная нумерация
От: londinium Украина  
Дата: 15.04.15 18:29
Оценка: -1
Здравствуйте, developer.cpp, Вы писали:

DC>После удаления строк, во множестве значений автоинкрементных первичных ключей idx записей появляются "дырки":

DC>
DC>idx data
DC>1   abc
DC>15  sdf
DC>18  dfg
DC>


DC>помогите устранить дырки в поле idx и получить такую таблицу

DC>
DC>idx 
DC>1  abc
DC>2  sdf
DC>3  dfg
DC>


DC>P.S. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.


Один вопрос -зачем? Пользователя вообще не надо смущать видом первичных ключей — у него от этого сон и аппетит портится
Re[2]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 18:33
Оценка:
Здравствуйте, londinium, Вы писали:

L>Один вопрос -зачем? Пользователя вообще не надо смущать видом первичных ключей — у него от этого сон и аппетит портится


пользователь не увидит ключи

разве я писал, что буду пользователю показывать ключи?
Re: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 18:38
Оценка: 2 (1) +2
Здравствуйте, developer.cpp, Вы писали:

d> После удаления строк, во множестве значений автоинкрементных первичных ключей idx записей появляются "дырки":

[...]

d> помогите устранить дырки в поле idx и получить такую таблицу

[...]

d> P.S. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.


Ох, опять "красивые номера". Что ж, видимо пора, давно не было.
Тут есть несколько подробных обсуждений, почему красивые номера не нужны, поищи, если интересно. Но раз заказчик хочет, ничего не поделаешь.

Если время не критично, то блокируй всю таблицу и перенумеровывай. Только есть одна проблема — перенумерация и первичный ключ ну никак не совместимы. Нужно сделать красивый номер вторичным ключом без автоинкремента. А первичным пусть управляет СУБД, и пользователю его не показывать.
avalon/1.0.442
Re[3]: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 18:48
Оценка:
Здравствуйте, developer.cpp, Вы писали:

d> пользователь не увидит ключи

d> разве я писал, что буду пользователю показывать ключи?

А кого еще волнует "бездырочность"?
avalon/1.0.442
Re[4]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 19:00
Оценка: :)
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, developer.cpp, Вы писали:


d>> пользователь не увидит ключи

d>> разве я писал, что буду пользователю показывать ключи?

W>А кого еще волнует "бездырочность"?


пользователю показываем номер строки.

алгоритм такой.

Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.
Re[5]: бездырочная нумерация
От: andrey82  
Дата: 15.04.15 19:19
Оценка:
Здравствуйте, developer.cpp, Вы писали:

DC>Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки.


А СУБД (какая, кстати?) что-нибудь из SELECT TOP / LIMIT / SKIP / ROW_NUMBER() умеет?
Re[6]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 19:21
Оценка:
Здравствуйте, andrey82, Вы писали:

A>Здравствуйте, developer.cpp, Вы писали:


DC>>Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки.


A>А СУБД (какая, кстати?) что-нибудь из SELECT TOP / LIMIT / SKIP / ROW_NUMBER() умеет?


SQLite3
Re[5]: бездырочная нумерация
От: merlin88  
Дата: 15.04.15 19:27
Оценка:
Здравствуйте, developer.cpp, Вы писали:

DC>алгоритм такой.


DC>Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.


Возможно я не правильно понял изначальное условие, но в oracle обычно делалось так. Первичные ключи? да обычно заполнялись сиквенциями, а пользователю, если ему нужна была сквозная нумерация выборки, подсовывалось специальное поле rownum.
select rownum, any_data from table;
Тут скорее встречный вопрос: целесообразно ли работать именно с массивами, а не попытаться решить это средствами самой субд. Но это конечно зависит от множества факторов, которые известны только Вам.
Re[5]: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 19:27
Оценка: 1 (1)
Здравствуйте, developer.cpp, Вы писали:

d> Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.


Так, значит это не проблема "красивых номеров".
Но я все еще не вижу необходимости в перенумерации. Для того, чтобы "грузить кусками", не нужна строгая последовательность номеров, достаточно того, что они монотонно возрастающие.

Дополнительные вопросы.
1. Какая СУБД и версия используется.
2. Если данные не в справочниках, а в других таблицах, то что в данном справочнике? Только номера, а в других таблицах FK ссылки на него?
avalon/1.0.442
Re[3]: бездырочная нумерация
От: Mr.Delphist  
Дата: 15.04.15 19:33
Оценка:
Здравствуйте, developer.cpp, Вы писали:

DC>пользователь не увидит ключи


DC>разве я писал, что буду пользователю показывать ключи?


Тогда зачем Вам неразрывное нумерование? Огласите свои цели, пожалуйста.
Re[7]: бездырочная нумерация
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.04.15 19:33
Оценка:
Здравствуйте, developer.cpp, Вы писали:

DC>SQLite3


Оно может что-то типа
SELECT 
  *
FROM
  BLABLA
WHERE 
  ID > LAST_READ_ID
ORDER BY ID
LIMIT 1000;

?

Я так кусками по 1000 строк синхронизировал данные через вебсервис.
Re[6]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 19:34
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, developer.cpp, Вы писали:


d>> Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.


W>Так, значит это не проблема "красивых номеров".

W>Но я все еще не вижу необходимости в перенумерации. Для того, чтобы "грузить кусками", не нужна строгая последовательность номеров, достаточно того, что они монотонно возрастающие.



W>Дополнительные вопросы.

W>1. Какая СУБД и версия используется.

SQLite3


W>2. Если данные не в справочниках, а в других таблицах, то что в данном справочнике? Только номера, а в других таблицах FK ссылки на него?


данные для обработки в других таблицах. Средствами СУБД их анализировать накладно, анализ делает специализированная числодробилка на C++.

данные вытаскиваются в многомерный массив u[i1][i2][i3][i4][i5], представляющий собой интерфейс к одномерному массиву. i1 --- номер из первого спраочника, i2 --- номер из второго справочника ...

Если i1 --- это индекс из "бездырочной нумерации" то по этому индексу запись делается сразу же в нужный участок памяти, и если i1 первичный ключ из множества
с дырками, то нужно вычислять что же это за элемент массива u
Отредактировано 15.04.2015 19:49 developer.cpp . Предыдущая версия .
Re[8]: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 20:08
Оценка:
Здравствуйте, MozgC, Вы писали:

MC> DC>SQLite3


MC> Оно может что-то типа

MC>
SELECT
MC>   *
MC> FROM
MC>   BLABLA
MC> WHERE
MC>   ID > LAST_READ_ID
MC> ORDER BY ID
MC> LIMIT 1000;
MC>

MC> ?

MC> Я так кусками по 1000 строк синхронизировал данные через вебсервис.


Оно может. Но тут даже без LIMIT можно обойтись. Просто выбрать первые 1000 строк и все.
avalon/1.0.442
Re[7]: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 20:08
Оценка:
Здравствуйте, developer.cpp, Вы писали:

d> данные вытаскиваются в многомерный массив u[i1][i2][i3][i4][i5], представляющий собой интерфейс к одномерному массиву. i1 --- номер из первого спраочника, i2 --- номер из второго справочника ...


d> Если i1 --- это индекс из "бездырочной нумерации" то по этому индексу запись делается сразу же в нужный участок памяти, и если i1 первичный ключ из множества

d> с дырками, то нужно вычислять что же это за элемент массива u

Но можно ведь нумеровать строки по мере выборки из БД, этого недостаточно?
avalon/1.0.442
Re[8]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 21:58
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, developer.cpp, Вы писали:


d>> данные вытаскиваются в многомерный массив u[i1][i2][i3][i4][i5], представляющий собой интерфейс к одномерному массиву. i1 --- номер из первого спраочника, i2 --- номер из второго справочника ...


d>> Если i1 --- это индекс из "бездырочной нумерации" то по этому индексу запись делается сразу же в нужный участок памяти, и если i1 первичный ключ из множества

d>> с дырками, то нужно вычислять что же это за элемент массива u

W>Но можно ведь нумеровать строки по мере выборки из БД, этого недостаточно?


я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.
Re[8]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 22:05
Оценка:
W>Но можно ведь нумеровать строки по мере выборки из БД, этого недостаточно?

Кстати, а порекомендуйте алгоритм перенумерации без дырок для некоторого поля type

на входе
idx   type   data
2     0      asd
22    3      sdf
55    5      fdf


на выходе
idx   type   data
2     0      asd
22    1      sdf
55    2      fdf
Re[9]: бездырочная нумерация
От: wildwind Россия  
Дата: 15.04.15 22:07
Оценка:
Здравствуйте, developer.cpp, Вы писали:

d> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.


Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?
avalon/1.0.442
Re[10]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 22:08
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, developer.cpp, Вы писали:


d>> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.


W>Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?


у меня много индексов i1, i2, i3, i4 --- при получении новой строки неизвестно какому делать ++ ...
Re[10]: бездырочная нумерация
От: developer.cpp Россия  
Дата: 15.04.15 22:10
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, developer.cpp, Вы писали:


d>> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.


W>Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?


я делаю select i1, i2, i3, i4 ....

а затем u[i1][i2][i3][i4] = ...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.