Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2008, 02:12   #1
spiteful41
 
Регистрация: 20.05.2008
Сообщений: 9
По умолчанию Уникальность индекса в БД

Помогите пожалуйста!!!Есть БД (ms Access), тип уникального ключа счетчик. Пишу прогу на Делфи. Нужно сделать следующее. Вот у меня при добавлении записи идет увеличение ключа на единицу, т.е 1,2,3.Если я удалю запись под ключом 1, у меня останутся записи 2,3. После этого, если я добавлю новую запись, то у нее уникальный ключ будет равен 4, а мне нужно что бы он был равен 1. Т.е, как бы "дырку" надо найти,т.е что бы не наращивался дальше ключ.(мне это нужно, что бы не были очень большие числа.)Добавляю запись при нажатии на кнопку.Помогите пожалуйста...
И подскажите откуда можно скачать картинки на кнопочки (а то,которые в делфи стандартные мне не нравятся=)))
Когда программист ложится спать,он ставит рядом с собой два стакана- первый с водой(на случай если он захочет пить),второй пустой(если не захочет)=))

Последний раз редактировалось spiteful41; 20.05.2008 в 02:41.
spiteful41 вне форума Ответить с цитированием
Старый 20.05.2008, 06:15   #2
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Организуешь цикл по количеству элементов в БД. Проверяешь в этом цикле, есть ли уже ключ с таким номером в базе. Если нету - вставляешь.
yourself вне форума Ответить с цитированием
Старый 20.05.2008, 08:11   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
а мне нужно что бы он был равен 1
Если не секрет зачем?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 08:42   #4
spiteful41
 
Регистрация: 20.05.2008
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если не секрет зачем?
мне нужно будет потом искать запись по ключу,тем более ключ в отчете отображается,а здоровые числа вводить не удобно и не красиво выглядит

Цитата:
Сообщение от yourself Посмотреть сообщение
Организуешь цикл по количеству элементов в БД. Проверяешь в этом цикле, есть ли уже ключ с таким номером в базе. Если нету - вставляешь.
так не получится,сравнивать не с чем,мне надо новой записи присвоить номер подходящей "самой первой дырки"
Когда программист ложится спать,он ставит рядом с собой два стакана- первый с водой(на случай если он захочет пить),второй пустой(если не захочет)=))

Последний раз редактировалось Stilet; 22.05.2008 в 09:13.
spiteful41 вне форума Ответить с цитированием
Старый 22.05.2008, 09:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
мне нужно будет потом искать запись по ключу
Т.е. ты вводиш индекс записи? Зачем такой геморр...
У тебя по любому получается что ключ записей равен RecNo, так зачем по нему искать? Я бы так не делал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 09:29   #6
AlexandrSid
Форумчанин
 
Регистрация: 31.10.2007
Сообщений: 103
По умолчанию

Уникальный ключ так и называется потомучто не поторяется никогда.
Но уж если так необходимо тогда тип поля уникальног ключа надо делать не "счетчик" а "длинное целое". Писать что-то вроде сиквенсов т.е. процедура которая перед возвращением следующего значения ID проверяет есть ли дыры т.е. 'Select Count(ID) AS NOM FROM Table' = 'Select top 1 id as NOM from table order by id desc' и если не равно то находит дыру.
Но если как ты говориш числа огромные то не думаю что тебя спасет это от длинных номеров.
Для чего отоброжать ID в отчете? он является инвентарным номером чего-то?

Для поиска минимальной дыры лучше не создавать цикл по количеству элементов БД, слишком долго.
Я бы сделал так
Если есть дыры догда

vCount = 'SELECT Count(ID) AS KolID FROM Table'!NOM

vCount = vCount/2
MaxID = 'SELECT TOP <vCount> id FROM Table Order by id'!id

Если MaxID > vCount тогда двигаешся в меньшую сторону на половину от vCount (vCount = vCount/2), если равно то в большую. И так до тех про пока у тебя не получится vCount(i-1) = MaxCount а vCount(i+1) < MaxCount, т.е. vCount(i) и будет твоей дырой (т.е. vCount должно быть = 1)

Если vCount/2 дробное округляешь в большую сторону

Последний раз редактировалось AlexandrSid; 22.05.2008 в 10:22.
AlexandrSid вне форума Ответить с цитированием
Старый 22.05.2008, 11:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

полностью согласен с мнением Stilet и AlexandrSid!
кроме того, очень рекомендую ознакомится со статьёй
"Естественные ключи против искусственных ключей" [А.Тенцер]
найти в Интернете элементарно, вот, нашёл, например, - здесь
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2008, 01:26   #8
spiteful41
 
Регистрация: 20.05.2008
Сообщений: 9
По умолчанию

Всем огромное спасибо за помощь!!!
Когда программист ложится спать,он ставит рядом с собой два стакана- первый с водой(на случай если он захочет пить),второй пустой(если не захочет)=))
spiteful41 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уникальность по 3 полям num8er БД в Delphi 3 09.10.2007 09:54