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

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

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

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

Я бы на вашем месте генерил номер фиксированной длинны (например, из девяти цифр):
cast(rand()*10000000000 as bigint), разбивая сгенерированный номер на триады (тысячи, миллиона, миллиарды) и разделяя их, к примеру черточками. Тогда общающиеся по телефону люди быстрои лекго смогут продиктовать и зафиксировать нужный номер. Кстати, для такого варианта вероятность совпадения с ранее сгенеренным номером равна 0.0000000001*(количество выданных ранее квитанций)
...
Рейтинг: 0 / 0
Генерация случайного уникального значения
    #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
Генерация случайного уникального значения
    #32059552
schoooltz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каждый следующий ID расчитавай как предыдущий + некоторое случайное значение в заданном интервале.

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


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


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