Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.06.2014, 01:55
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 1  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Question SQLite - Как пересчитать id в столбце?

Здравствуйте, уважаемые форумчане!

Есть необходимость пересчитать Праймари кей Id после удаления записи в базе данных Сиквел. Например, есть пять записей с Id = 1, 2, 3, 4, 5. Удаляю третью запись: 1, 2, 4, 5. Необходимо вернуть Id прежнюю последовательность - по возрастанию без прерываний.
Читал подобный вопрос на другом форуме, но немного не разобрался. Может кто уже реализовывал подобное?
__________________
Набирать программы могут многие, программировать - единицы

Старый 24.06.2014, 04:10
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Трогать ID после записи — плохая затея. Это же не какое-то там поле для удовлетворения перфекционистов, это уникальный идентификатор записи!
__________________
Поймай яблоко 2!

Старый 24.06.2014, 08:41
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 3  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Расскажите лучше, зачем вам это надо.
В посте как раз написано, что следует завести доп. поле, которое будет указывать на порядковый номер, а не использовать столец, на котором висит primary индекс.

По сути вы при каждой вставке считаете количество записей в таблице, при это позиция новой записи будет равна N + 1, где N - текущее кол-во записей.

Далее при удалении вы берете все записи, которые "выше" удаляемой и декриментите у них позицию.

Старый 24.06.2014, 23:43
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 4  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Сообщение от Zebestov Посмотреть сообщение
...это уникальный идентификатор записи!
Согласен. По нему я нахожу редактируемую строчку в таблице и через него могут быть связи с другими таблицами базы.

Ход моих мыслей: этот столбец я использую в качестве порядкового номера записи в DataGrid. Столбец у меня называется "№ з\п" которому я присваиваю этот Primary key. Клацая по ячейке пользователь, так скажем, привязывается к записи через порядковый номер и все запросы обращаются через "№ з\п". Соответственно удаляя строчку, удаляется и красивый порядок возрастания "№ з\п", хоть и суть обращения к записям не меняется. Изложил очевидные вещи, но в этом суть.

Идея с дополнительным столбцом в общем то понятна, но сразу возникает вопрос: если записей будет тысяча и удалю я третью строчку, то нужно сделать 997 запросов в базу дабы декрементировать все порядковые номера что выше... В посте я не разобрался как это сделать. Может есть реализации, ссылки на удачные примеры? Ну или может кто подскажет другую логику вывода базы данных в приложение и обращение к ее строкам..
__________________
Набирать программы могут многие, программировать - единицы

Старый 25.06.2014, 04:06
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
1. ID на протяжении жизни базы менять не следует.
2. Вся эта визуальная красота с порядковыми номерами делается с помощью LIMIT & OFFSET
__________________
Поймай яблоко 2!

Старый 25.06.2014, 08:38
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 6  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Цитата:
Ход моих мыслей: этот столбец я использую в качестве порядкового номера записи в DataGrid. Столбец у меня называется "№ з\п" которому я присваиваю этот Primary key. Клацая по ячейке пользователь, так скажем, привязывается к записи через порядковый номер и все запросы обращаются через "№ з\п". Соответственно удаляя строчку, удаляется и красивый порядок возрастания "№ з\п", хоть и суть обращения к записям не меняется. Изложил очевидные вещи, но в этом суть.
Цитата:
2. Вся эта визуальная красота с порядковыми номерами делается с помощью LIMIT & OFFSET
И не усложняйте себе жизнь. Заводите счетчик, который будет порядковым номером. При выводе каждой строчки инкрементите его и так же выводите. Если у вас выводятся записи с 20 по 30, то и счетчик изначально будет не 0, а 20.

Цитата:
Клацая по ячейке пользователь, так скажем, привязывается к записи через порядковый номер и все запросы обращаются через "№ з\п".
А это неправильно. Обращайтесь через primary key

Старый 26.06.2014, 23:14
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 7  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Спасибо за ответы.

Цитата:
Сообщение от Zebestov
1. ID на протяжении жизни базы менять не следует.
Понятно, таки нужно заводить дополнительный столбец с порядковым номером.

Цитата:
2. Вся эта визуальная красота с порядковыми номерами делается с помощью LIMIT & OFFSET
Материал хороший, спасибо, но мне бы пример реализации по возможности или ссылки на практику, быстрее разберусь.

Цитата:
Сообщение от bifidokk
И не усложняйте себе жизнь. Заводите счетчик, который будет порядковым номером. При выводе каждой строчки инкрементите его и так же выводите. Если у вас выводятся записи с 20 по 30, то и счетчик изначально будет не 0, а 20.
На реальном коде проще разобраться. Тоже прошу по возможности реализацию кидануть или ссылку, так как первая цитата Zebestov'а перечет Вашей (по крайней мере я так понял). Дабы не запутаться нужно переходить на примеры.


.
__________________
Набирать программы могут многие, программировать - единицы

Старый 26.06.2014, 23:26
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Нет нет, ничего не перечит.
Ты создаешь записи, ID инкрементится.
Удаляешь записи, ряд ID перестает быть непрерывным, приобретает пропуски.
Таким образом у тебя всю жизнь базы ID конкретной записи всегда один и тот же.
При отображении ты будешь использовать LIMIT и OFFSET для постраничного вывода строк из базы (1...10, 11...20 и т.д.). Так вот эти номера строк не имеют ни какого отношения к ID базы, они просто для красоты, чтобы пользователь радовался. Но если он выберет конкретные записи и захочет с ними что-то сделать, твое отображение всегда будет знать, что, например:

1-я запись — это ID = 1
2-я запись — это ID = 2
3-я запись — это ID = 4, бо вчера запись с ID = 3 потерли

10-я запись — это ID = 11 (бо до этого момента только третью запись удалили)

Вот и вся любов.
__________________
Поймай яблоко 2!

Старый 26.06.2014, 23:53
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 9  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Сообщение от Zebestov Посмотреть сообщение
Вот и вся любов.
Да, очень даже доходчиво объяснили, спасибо. Теперь мне наверное нужно объяснить логику приложения, так как видимо LIMIT и OFFSET мне не очень подходят (сори, что сразу не уточнил эти детали). Дело в том, что при запуске приложения я делаю 5-6 запросов и получаю столько же массивов с результатами SQL запроса и формирую столбцы и строки в DataGrid. Тоесть я частично отхожу от классических запросов в базу и работаю со стандартными возможностями массивов: Array.filter(). Есть несколько фильтров на основе компонента List, по которым в доли секунды производится поиск данных. Дальше пользователь произвел изменения в DataGrid и зная что поле "№з/п" у меня выполняет функцию уникального Id записи в базе, я могу вносить изменения в базу.

Может я как-то неправильно это реализовал? Через чур упростил себе жизнь и дальше мне это выльется в последствиях? И как в моем случае реализовать красивый порядковый номер столбца "№з/п", только дополнительным столбиком в базе?
__________________
Набирать программы могут многие, программировать - единицы

Старый 27.06.2014, 00:04
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 10  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Ну можно при выборке просто на лету собрать все данные в объект, в котором среди прочих данных из базы, включая ID, будет поле, скажем, num, которое и указывает порядковый номер в твоем списке. Таким образом твое приложение в любой момент будет знать, какой ID у записи номер 100500.

Разумеется при удалении некоторых записей в течение сессии тебе конечно же придется делать пересчет (декремент) всех "num" после удаленной. Но это лишь на протяжении сессии(!) и лишь в данном конкретном приложении, а не в базе, чтобы конкретный пользователь работал со своими красивыми порядковыми номерами, не внося путаницу в БД.

Однако это тоже можно счесть путаницей — как бы пользователь не забыл, что он только что удалил запись №100500 и теперь под этим номером уже совсем другие данные (а именно те, которые стояли следом).

В обычных клиентах такое не происходит, потому что порядковые номера — это всего лишь декор. Ну т.е. следователь не парится, что папка с делом №3 теперь на самом верху, потому что два предшествующих дела уже закрыли. Он всегда работает не с порядком расположения папок в стопке, а с их номерами.

Либо я не знаю какой-то особенной роли именно порядка вывода данных в нумерованный список, либо ты слишком уж много внимания уделяешь этой нумерации.
__________________
Поймай яблоко 2!

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
SQLite , запрос , удаление
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.