![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
CBEPX4EJIOBEK |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.4.2008 Репутация: нет Всего: нет |
как можно менее затратно сгенерировать значение, имея список значений, в который полученное значение не должно входить.
Более частная задача: есть таблица, необходимо написать генератор который бы генерировал значения для id (таблица уже заполнена, есть как id = 1 так и id = 99999 (max 99999)) |
|||
|
||||
amigooo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
|
|||
|
||||
CBEPX4EJIOBEK |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.4.2008 Репутация: нет Всего: нет |
ну этот способ очевиден, но вот например если не инкремировать поинт а генерировать рандомно... что быстрее работать будет?
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Зависит от соотношения занятых к общему числу ключей и их распределения. А задача какая? Если генерация ключей для СУБД, то единственно правильный способ, это использовать сиквенс/автоинкремент. Все остально велосипед с квадратными колесам и/или источник гарантированных ошибок. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
CBEPX4EJIOBEK |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.4.2008 Репутация: нет Всего: нет |
необходимо генерить ключи для субд... единственное что таблица уже заполнена некоторыми значениями (id без порядка (есть записи с id = 5 и 100 и 899, но нету например записи с id=6, 7, 102)) и не известно с какого момента начинать инкримент или т.п.
|
|||
|
||||
godvinn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 4.4.2008 Где: possibility of mo ving to Kyiv Репутация: нет Всего: 1 |
А если при генерации этих чисел, на каждой итерации проверять - если ли такое чисто в базе, если нет то инсертить.
|
|||
|
||||
amigooo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
Чем проше тем лучше. Из вашего условия следует что так или иначе придёться узнавать занятость всех id, инкрементный способ в любом случае позволяет для каждого id сделать только одну проверку. способ с рандомной генерацией будет так работать в самом лучшем случае, что мало вероятно. Когда 90% id будет уже заняты попробуйте рандомно попасть в оставшиеся 10%. Я уже не говорю о простоте/скорости операции инкремент по сравнению с генерацией псевдо случайных чисел. |
|||
|
||||
lBugl |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 18.8.2009 Репутация: нет Всего: 2 |
если таблица досталась в наследство и её нуна интегрировать в базу, то предлагаю следующее:
создать в базе идентичную таблицу такой же структуры "+" поле автоинкремент (мб праймари кей) и "-" твоё поле (которое как бы является разбросанными ключами). а далее при добавлении в базу записей id будет сам генериться и заполняться... зы: мб ляпнул чёта не то... =) |
|||
|
||||
Aikus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 29.11.2007 Репутация: нет Всего: 1 |
Если БД способна сама генерировать id, то лучше порыться в ней. Если не способна (да и такие бывают), думаю можно вычислить наибольшее число, записать его в ту же базу плясать от него:
1. взял значение, которое ты считаешь самым большим 2. прибавил 1 3. записал новое значение 4. сохранил объект в пп. 2 и 4 надо ещё предусмотреть исключения и их обработку |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Хоть один пример БД (современной) которая не умеет генерировать гарантировано-уникальные ключи.
5. Получил ошибку, потому как паралельная сессия уже успела занять этот ID ![]() Хороший вариант. В любом случае ключи лучше всего генрировать самой СУБД. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |