| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > База данных |
| Автор: MacTep 4.10.2004, 20:37 |
| Как обнулить autoincremet-поле в таблице Paradox. Дело в том, что в процессе работы моей программы постоянно это поле увеличивается и увеличивается. Когда я запись из таблицы удаляю, то вовсе не уменьшается значение этого поля на единицу для всех остальных записей, а наоборот, следующая созданная запись имеет +1 большее значение этого поля. Может возможно его обнулить в какое-то время? |
| Автор: Pakshin A. S. 4.10.2004, 20:40 |
| Sorry, что не ответ, а вопрос: а что это за поле? |
| Автор: MacTep 4.10.2004, 20:47 |
| Это такое поле, которое само по себе прибавляется на 1 при создании новой записи: auto - автоматически; increment - увеличение на 1. |
| Автор: Pakshin A. S. 4.10.2004, 20:49 |
| А как его устанавливать? Через что* |
| Автор: MacTep 4.10.2004, 20:54 |
| Это делается в Database Desktop'е. Когда таблицу создаем, там и устанавливаем тип поля! |
| Автор: Pakshin A. S. 4.10.2004, 20:59 |
| Угу... спасибо. попробуем разобраться... Добавлено @ 21:00 А может заменить его на обычное числовое поле и самостоятельно при добавлении/удалении изменять его значение (немного дольше, но алгоритм понятнее...) |
| Автор: MacTep 5.10.2004, 07:21 |
| Нет, так не прет. Это не только намного дольше, а просто офигительно долго. Нужно что-то другое! |
| Автор: _hunter 5.10.2004, 11:06 | ||||
никак -- на то оно и auto
так и должно быть ( значение счетчика -- _глобальное_ для таблицы ) проблему можно решить разве что переиндексацией таблицы ( например раз в день ) P.S. а нужно ли его обнулять? |
| Автор: MacTep 5.10.2004, 17:28 |
| Тогда такой вопрос: как таблицу переиндексировать? Что имеется ввиду под этим выражением. При чем тут индексы? А обнулять для того, чтобы когда-нибудь, пусть и не скоро, не произошло какой-нибудь ошибки. А то в данный момент в моей маленькой базе уже эти поля до значения 400 дошли, а что будет потом? |
| Автор: Pakshin A. S. 5.10.2004, 17:32 | ||
[offtop=небольшое отступление] Большущий облом... числа кончатся, тогда нодо предложить пользователю почистить базу данных или ещё что-нибудь сделать... Это можно устроить при добавлении новой записи: проверять, есть ли возможность увеличить индекс? А конченое число индекса можно установить эксперементально... [/offtop] |
| Автор: _hunter 5.10.2004, 19:10 |
| Переиндексация это создание новой временной таблицы ( в ней индекс пойдет с нуля ) с последующим замещением исходной таблицы |
| Автор: Cashey 5.10.2004, 19:31 |
| Не забывайте о такой вещи как упаковка таблицы. после ее осуществления "лишние" номера удалятся, т.е. перенумеруются. И еще есть вариант, поменять тип поля на integer, обработать, и вернуть обратно в тип автонумерации. Эти типы спокойно переживают такие переобразования. |
| Автор: MacTep 5.10.2004, 22:11 |
| Cashey, дельное предложение. А теперь можно подробнее о том, что ты назвал упаковкой. Как она выполняется и поподробнее, если возможно. И еще, как сменить программно тип поля? |
| Автор: _hunter 6.10.2004, 10:21 |
| Cashey, пытался я делать такие преобразования в аксессе -- в int конвертилось без проблем, а вот назад -- нет упаковка не поможет по причине запоминания значения счетчика -- следующее значение будет +1 к нему |
| Автор: MacTep 7.10.2004, 20:41 |
| Обидно, досадно... А исправить все-таки можно как-нить или все старания напрасны? |
| Автор: ДЫМ 8.10.2004, 01:49 |
| А что ты все-таки не хочешь переиндексировать таблицу, во всех серьезных программах, что я видел (в том числе и 1С), переиндексация присутствует. Да и вряд ли поле переполнится, наверняка оно поддерживает 64-разрядные целые, сколько же надо модифицировать таблицу (удалять, добавлять записи), чтобы число автоинкремента достигло максимума? Еще один нюанс - а ну как по этому полю установлена связь с другими таблицами, тогда при модификации автоинкремента надо модифицировать соответствующие поля в подчиненных наборах, можно такого наворотить... |
| Автор: _hunter 8.10.2004, 19:20 |
| MacTep, исправить не получится ( это все же не ошибка хотя переиндексацию делать всеравно придется: удаление записей |
| Автор: MacTep 8.10.2004, 22:09 |
| Так вы мне объясните, как делается переиндексация? Приведите, пожалуйста, хоть какой-то ходенький бедненький примерчик, а то все на словах и на словах! |
| Автор: ДЫМ 9.10.2004, 01:24 |
| Самый простой путь (в DBase иного нет) для переиндексации - создай точно такую же таблицу(с той же структурой) программно или скопируй заранее подготовленную пустую и копируй записи в нее в цикле или через кверю. |
| Автор: MacTep 9.10.2004, 07:35 |
| а потом снова перегонять в мою первую основную таблицу? |
| Автор: Akella 9.10.2004, 09:29 | ||
| есть такое понятие, как упаковка таблиц хотя значения в 4 млрд тебе хватит на многие годы, даже если добавлять записи в таблицу круглосуточно с интервалом в 1 сек то посчитай на сколько дестялетий хватит. Если все-таки хочешь обнулять то держи код...
|
| Автор: MacTep 10.10.2004, 23:01 |
| dsergey, а вот за это огромное спасибо! Отлично! |