Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Генерация случайного уникального значения / 12 сообщений из 12, страница 1 из 1
17.10.2002, 20:02:28
    #32059422
Alex_i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Есть необходимость генерить случайное и уникальное целое число. Как это можно реализовать, без просмотра всей таблицы перед вставкой очередного случайного значения.
...
Рейтинг: 0 / 0
17.10.2002, 20:36:37
    #32059430
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Какое же это случайное значение, если оно уже ограничено какими-то другими значениями ?
Получается так - выбирите случайное число от 1 до 10 при условии, что значения 1,2,3,4,6,7,8,9 и 10 уже заняты ?
...
Рейтинг: 0 / 0
17.10.2002, 21:01:32
    #32059432
Alex_i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Нет. Суть в том, что нужно поле как с автоинкрементом, только значения в нем не должны бать последовательны. А генерятся ини из диапазона значений, заведомо превышающего максимально возможное количество записей в таблице.
...
Рейтинг: 0 / 0
17.10.2002, 22:18:09
    #32059436
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Сгенерить случайное число можно с помощью cast(rand()*100000 as int). Генерить его можно в цикле, проверя сразу после генерации, нет ли совпадений с ранее сгенеренными. Если по этому полю постоен индекс, то работать должно вполне шустро.

Вот только какая-то странная задача. Может вы объясните, зачем это нужно? Просто, есть подозрение, что вы на нее не с того фланга заходите
...
Рейтинг: 0 / 0
17.10.2002, 22:50:01
    #32059441
случайный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Два варианта
- используй GUID - почти случайное
число
- или создай специальную таблицу с несколькими полями
и одной записью. В полях будет текущее значение id.
В хранимой процедуре поля обновляются
и гениерится новый id
...
Рейтинг: 0 / 0
17.10.2002, 23:22:31
    #32059444
Alex_i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Конечная задача - это получение номера квитанции. Он естесственно должен быть уникален. Но если использовать просто автоинкремент, то легко вычислить количество квитанций за период (дата на ней тоже стоит). Этого нельзя допустить. Первая мысль генерить значение через random, а потом проверять, есть ли уже такое число в таблице. А база и так уже не быстра. Хочется избавиться от сканирования таблицы. Ведь чем дальше - тем больше вероятность повторения.
...
Рейтинг: 0 / 0
18.10.2002, 09:21:59
    #32059487
Оля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
День добрый!

Если генерировать через random, то обязательно придется проверять. Поищите в классе шифрованных ключей. Например - автоинкремент , который преобразуется в текст и по алгоритму между позициями нечто вставлется (буквы алфавита, буквы фамилии клиента, даты заключения договора и т.п.). Т.е. процедуры шифрования и дешифрования, известные только Вам, а не клиенту.
Удачи!
...
Рейтинг: 0 / 0
18.10.2002, 10:31:41
    #32059526
Белов Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
- GUID
- timestamp
...
Рейтинг: 0 / 0
18.10.2002, 10:32:00
    #32059527
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Если вы будете приводить к Bigint, умножая на диапазон всех его положительных чисел, то вероятность появления хотя бы одного повторного значения будет очень мало отличаться от нуля... Я думаю, что первое совпадение с ранее выпавшим случайным числом у Вас произойдет не раньше, чем лет через десять. А имея индекс по этому полю проверить if exists(.... where Number=@Number) можно очень шустро. Если я правильно понял, то частота подобных проверок соответствует частоте выписки квитанций. Вполне потянет и подобное решение.

Я хотел и сам предложить GUID, но конкретно для данной задачи он очень неудобен в использовании. Представьте, что вы - оператор на телефоне. Вам звонит клиент с какой-то проблемой... Вы просите его назвать номер квитанции... А тпепрь записывайте, после каждого символа переспрашивая, что он имеет в виду (особенно, если он английские буквы в первый раз видит).

Я бы на вашем месте генерил номер фиксированной длинны (например, из девяти цифр):
cast(rand()*10000000000 as bigint), разбивая сгенерированный номер на триады (тысячи, миллиона, миллиарды) и разделяя их, к примеру черточками. Тогда общающиеся по телефону люди быстрои лекго смогут продиктовать и зафиксировать нужный номер. Кстати, для такого варианта вероятность совпадения с ранее сгенеренным номером равна 0.0000000001*(количество выданных ранее квитанций)
...
Рейтинг: 0 / 0
18.10.2002, 10:39:26
    #32059530
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Для ускорения (избавляемся от явных циклов) и простоты использования можно как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create view rand_vw_uint
as
select cast(rand()* 1000000000  as int) as rnd
go

select top  1  r.rnd as new_id
from rand_vw_uint r
where not exists(select * from sysobjects o where o.id = r.rnd)
...
Рейтинг: 0 / 0
18.10.2002, 11:07:53
    #32059552
schoooltz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
Каждый следующий ID расчитавай как предыдущий + некоторое случайное значение в заданном интервале.

PS : bigint - хватит на долго


select @NewID = max(ID) + cast(rand()*100 as int) from ...
...
Рейтинг: 0 / 0
18.10.2002, 11:53:49
    #32059589
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация случайного уникального значения
2schoooltz. И чем же вычисление Max(ID) лучше exists()?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Генерация случайного уникального значения / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]