Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 158
от 20.10.2006, 17:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 374, Экспертов: 50
В номере:Вопросов: 1, Ответов: 3


Вопрос № 58985: оброго времени суток, уважаемые эксперты. Мне нужно записывать в таблицу данные так чтобы определенное поле не содержало пропусков. Т.е. если есть 100 записей и запись с номером 50 удаляют то при следующем добавлении в этом поле было не 101 а 50....

Вопрос № 58.985
оброго времени суток, уважаемые эксперты.
Мне нужно записывать в таблицу данные так чтобы определенное поле не содержало пропусков. Т.е. если есть 100 записей и запись с номером 50 удаляют то при следующем добавлении в этом поле было не 101 а 50. Извините если не четко выразился.
Заранее благодарен
Отправлен: 15.10.2006, 16:03
Вопрос задал: Mefisto (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: din
Здравствуйте, Mefisto!
Решение тут одно, сохранять где-нибудь номер последней удаленной записи, а при добавлнении новой делать проверку на наличии такогого номера. Естественно что поле "Номер записи" не должно быть типа "Счетчик" (Autoincrement и т.п.).
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Практикант)
Ответ отправлен: 15.10.2006, 16:25
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Игорь Елизаров
Здравствуйте, Mefisto!
Если удаляется запись с максимальным номером, то можно сделать следующим образом..
Первым запросом узнаем максимальный существующий номер записи
затем при формировании новой записи прибавляем к номеру единицу.

Если удаляется запись из середины, то все несколько сложнее..
надо получить "дырку" с минимальным номером.

Хотя можно объединить эти два способа следующим образом.
Заводим отдельную таблицу, содержащую одно целочисленное поле (можно даже счетчик).
Заполняем эту таблицу цифирками от 1 до, скажем, 1000 (ну или сколько предположительно записей в исходной таблице ? и это количество умножить на два или на три).

вот. получили таблицу.

Теперь формируем запрос по отсутутсвующим номерам и сортируем по возрастанию и берем первую запись.

примеро так (для MS SQL)
предполагаю, что общий список номеров - в таблице Numbers
исходная таблица Table1 содержит поле Number1, "дырки в котором мы и ищем
top 1 - отбираем только одну запись из отсортированного списка
order by numbers.id - сортировка по возрастанию
select top 1 numbers.id from numbers left join table1 on numbers.id = table1.number1
where table1.number1 is null
order by numbers.id
В результате выполнения этого запроса мы получим первый свободный номер.
Ответ отправил: Игорь Елизаров (статус: 7-ой класс)
Ответ отправлен: 15.10.2006, 19:26
Оценка за ответ: 5

Отвечает: Скип Кудета
Здравствуйте, Mefisto!

Так, вижу примерно такие способы.
1. Если это не критично, то не менять ничего в самой базе, а считать их при обработке. Сделали выборку из базы, посчитали количество полученных элементов, при выводе их пользователю или еще какой обработке - последовательно указываем номер текущей записи. Естественно, это катит если с результатом выборки мы работаем при помощи какого-нить языка программирования.
2. Просто тупо уменьшаем значение поля с номерами после удаленной записи :-)
Значит, это примерно так происходит.
Сначала некоторая запись удаляется

1. SELECT FROM table_name WHERE (нужное условие)
2. Теперь выборку банально разбираем по полям и значения поля с номерами записей - пихаем в массив. Не привожу код, томущо не знаю на каком языке требуется, но сама операция стандартна и, наверняка, отработана всеми уже до автоматизма.
3. DELETE FROM table_name WHERE (нужное условие)
4. Тащимся к нашему массиву, и тут перед нами обратно два пути: либо тупо перебирать всего его элементы и просить родную базу уменшить соотв. значения полей, с номеромами за нужным, либо придумать изячный алгоритм для более быстрой и эффективной работы.

Приложение:

Ответ отправил: Скип Кудета (статус: 1-ый класс)
Ответ отправлен: 16.10.2006, 13:31


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное