После удаления строк, во множестве значений автоинкрементных первичных ключей idx записей появляются "дырки":
idx data
1 abc
15 sdf
18 dfg
помогите устранить дырки в поле idx и получить такую таблицу
idx
1 abc
2 sdf
3 dfg
P.S. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.
Здравствуйте, 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. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.
Один вопрос -зачем? Пользователя вообще не надо смущать видом первичных ключей — у него от этого сон и аппетит портится
Здравствуйте, londinium, Вы писали:
L>Один вопрос -зачем? Пользователя вообще не надо смущать видом первичных ключей — у него от этого сон и аппетит портится
пользователь не увидит ключи
разве я писал, что буду пользователю показывать ключи?
Здравствуйте, developer.cpp, Вы писали:
d> После удаления строк, во множестве значений автоинкрементных первичных ключей idx записей появляются "дырки":
[...]
d> помогите устранить дырки в поле idx и получить такую таблицу
[...]
d> P.S. "починить" таблицу мне нужно во время работы пользователя, т.е. когда он удаляет записи из небольшой таблицы-справочника. Здесь время не критично.
Ох, опять "красивые номера". Что ж, видимо пора, давно не было.
Тут есть несколько подробных обсуждений, почему красивые номера не нужны, поищи, если интересно. Но раз заказчик хочет, ничего не поделаешь.
Если время не критично, то блокируй всю таблицу и перенумеровывай. Только есть одна проблема — перенумерация и первичный ключ ну никак не совместимы. Нужно сделать красивый номер вторичным ключом без автоинкремента. А первичным пусть управляет СУБД, и пользователю его не показывать.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, developer.cpp, Вы писали:
d>> пользователь не увидит ключи d>> разве я писал, что буду пользователю показывать ключи?
W>А кого еще волнует "бездырочность"?
пользователю показываем номер строки.
алгоритм такой.
Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.
Здравствуйте, developer.cpp, Вы писали:
DC>Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки.
А СУБД (какая, кстати?) что-нибудь из SELECT TOP / LIMIT / SKIP / ROW_NUMBER() умеет?
Здравствуйте, andrey82, Вы писали:
A>Здравствуйте, developer.cpp, Вы писали:
DC>>Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки.
A>А СУБД (какая, кстати?) что-нибудь из SELECT TOP / LIMIT / SKIP / ROW_NUMBER() умеет?
Здравствуйте, developer.cpp, Вы писали:
DC>алгоритм такой.
DC>Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.
Возможно я не правильно понял изначальное условие, но в oracle обычно делалось так. Первичные ключи? да обычно заполнялись сиквенциями, а пользователю, если ему нужна была сквозная нумерация выборки, подсовывалось специальное поле rownum.
select rownum, any_data from table;
Тут скорее встречный вопрос: целесообразно ли работать именно с массивами, а не попытаться решить это средствами самой субд. Но это конечно зависит от множества факторов, которые известны только Вам.
Здравствуйте, developer.cpp, Вы писали:
d> Данных слишком много (отмечу, что не в справочниках) и они не помещаются в ОП. А проанализировать их можно быстро, загрузив в непрерывный одномерный массив. Поэтому гружу в массив кусками select where 1<=idx<1000, затем select where 1000<=idx<2000 ... и обрабатываю по отдельности, а затем собираю результат обработки. Во время анализа на перенумерацию время тратить не эффективно, а вот когда пользователь ковыряется с таблицами пусть перенумеровывается.
Так, значит это не проблема "красивых номеров".
Но я все еще не вижу необходимости в перенумерации. Для того, чтобы "грузить кусками", не нужна строгая последовательность номеров, достаточно того, что они монотонно возрастающие.
Дополнительные вопросы.
1. Какая СУБД и версия используется.
2. Если данные не в справочниках, а в других таблицах, то что в данном справочнике? Только номера, а в других таблицах FK ссылки на него?
Здравствуйте, 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
Здравствуйте, developer.cpp, Вы писали:
d> данные вытаскиваются в многомерный массив u[i1][i2][i3][i4][i5], представляющий собой интерфейс к одномерному массиву. i1 --- номер из первого спраочника, i2 --- номер из второго справочника ...
d> Если i1 --- это индекс из "бездырочной нумерации" то по этому индексу запись делается сразу же в нужный участок памяти, и если i1 первичный ключ из множества d> с дырками, то нужно вычислять что же это за элемент массива u
Но можно ведь нумеровать строки по мере выборки из БД, этого недостаточно?
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, developer.cpp, Вы писали:
d>> данные вытаскиваются в многомерный массив u[i1][i2][i3][i4][i5], представляющий собой интерфейс к одномерному массиву. i1 --- номер из первого спраочника, i2 --- номер из второго справочника ...
d>> Если i1 --- это индекс из "бездырочной нумерации" то по этому индексу запись делается сразу же в нужный участок памяти, и если i1 первичный ключ из множества d>> с дырками, то нужно вычислять что же это за элемент массива u
W>Но можно ведь нумеровать строки по мере выборки из БД, этого недостаточно?
я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.
Здравствуйте, developer.cpp, Вы писали:
d> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.
Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, developer.cpp, Вы писали:
d>> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.
W>Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?
у меня много индексов i1, i2, i3, i4 --- при получении новой строки неизвестно какому делать ++ ...
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, developer.cpp, Вы писали:
d>> я посмотрел, в sqlite3 rownum не работает + подумал, что когда пользователь работает со справочником перестроить справочник при редком удалении строк совсем не заметно. А вот что то вычислять вдобавок к итак трудоемкому алгоритму не стал.
W>Зачем rownum? В приложении, получив очередную строку, сделать i++ сложно что ли?