powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Рандомный автоиндекс
25 сообщений из 49, страница 1 из 2
Рандомный автоиндекс
    #39060644
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть есть таблица

Код: sql
1.
create table t (id int not null, primary key (id));



При этом логика нашего клиентского приложения предполагает хранение в этой таблице айдишников, которые больше 100000 и меньше 999999, то есть всегда шестизнак.

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

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

Вопрос: может есть какие-то секретные шняжки для решения подобной задачи?
Типа как бы аналог auto_increment, только типа как бы типа такого

Код: sql
1.
create table t (id int not null auto_random_value(100000, 999999), primary key (id));
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060646
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а надо "настоящий" ранодом или и псевдо устроит?
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060649
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
генерить рандомное число, выбирать первое несуществующее больше него.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060653
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowгенерить рандомное число, выбирать первое несуществующее больше него.так со временем образуются заполненные интервалы
я почему и спрашиваю ТСа о допустимости псевдослучайности
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060655
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirа надо "настоящий" ранодом или и псевдо устроит?

вопрос не понятен....
прошу уточнить...

ScareCrowгенерить рандомное число, выбирать первое несуществующее больше него.

а каким запросом узнать первое несуществующее число больше 463504?
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060663
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select min(t1.id)
from tbl t1
join tbl t2 on t1.id=t2.id-1
where t1.id>463504 and t2.id is null
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060689
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir
Код: sql
1.
2.
3.
4.
select min(t1.id)
from tbl t1
join tbl t2 on t1.id=t2.id-1
where t1.id>463504 and t2.id is null



Благодарю!

Тут ещё ограничитель сверху до кучи

Код: sql
1.
2.
3.
select min(t1.id) nextId 
    from tbl a join tbl b on a.id = b.id - 1
    where a.id > 463504 and a.id < 999999 and b.id is null



собственно мой изначальный вопрос был в том, что существуют ли в мускуле какие-нибудь штатные инструменты для решения подобных задач? или рандомные айдишники - это только через клиента мутить? неужели мускул не дает в этом случае никаких рандомных инструментов?

PS. кстати, а просто для общего развития, что имелось ввиду под настоящий или псевдо-рандом?
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060694
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если действовать только средствами MySQL, то я бы заготовил заранее перемешанную таблицу на нужное количество записей. Перемешать можно с помощью ORDER BY RAND(). Это очень не быстро, но для разового выполнения сойдет.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060721
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсли действовать только средствами MySQL, то я бы заготовил заранее перемешанную таблицу на нужное количество записей. Перемешать можно с помощью ORDER BY RAND(). Это очень не быстро, но для разового выполнения сойдет.

ОООО!!! Идея прикольная, тем более в данном случае мы точно знаем, что записей у нас всего 899999.

1) Для меня это новая идея, что создание некой новой сущности в системе - это не insert + update, а такая разновидность update, которая скидывает флаг "isBlank" в ноль....

правда теперь придется обмозговать какие это внесет дополнения в стиль работы
например, теперь вместо select * from t придется делать select * from t where isBlank = false просто для того чтобы узнать количество записей

2) order by rand() тут наверное лишний, потому что для создания такой таблицы лучше на клиенте создать массив и перемешать его, а затем уже проинсертить все 899999 пар (id, seqId) и для активации ("создания") новой записи просто искать минимальный seqId с флагом isBlank = true
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060730
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix1) Для меня это новая идея, что создание некой новой сущности в системе - это не insert + update, а такая разновидность update, которая скидывает флаг "isBlank" в ноль....Можно и так. А можно просто удалять из таблицы использованные значения.
Lumix2) order by rand() тут наверное лишний, потому что для создания такой таблицы лучше на клиенте создать массив и перемешать его, а затем уже проинсертить все 899999 пар (id, seqId) и для активации ("создания") новой записи просто искать минимальный seqId с флагом isBlank = trueorder by rand() позволяет всю подготовку выполнить средствами MySQLбуквально в пару-тройку команд. Конечно, можно то же самое сделать и на клиенте, но кодить придется чуток побольше.

Кстати, а зачем тут поле id? не вижу в нем необходимости.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060741
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftМожно и так. А можно просто удалять из таблицы использованные значения.

miksoftКстати, а зачем тут поле id? не вижу в нем необходимости.

может я опять криво объяснил с самого начала
ситуация такая

допустим у нас есть таблица, которая ведет учет животных в зоопарке

Код: sql
1.
create animals (id int primary key auto_increment, type char(32), name text, country text, manager_userId)



все круто, все как обычно...
но в этой задаче номер животного может быть только [100000, 999999), то есть только шестизначным числом (это полбеды, ведь можно было бы просто прокрутить auto_increment до 100000 и поехали... в этой задаче важно новым животным присваивать номера случайным образом

поступила например лошадь
Код: sql
1.
insert into animals value (null, 'horse', 'Сивка', 'Афганистан', 7504)



только вместо null нам важно присвоить какой-то случайный номер из диапазона [100000, 999999) и чтобы этого номера ещё не было бы в этой таблице

вот в чем ситуация...

поэтому я думал вы предлагаете сразу в этой таблице создать 8999999 животных, у которых id будет распределен случайно, а вот seqId будет последовательным и когда мы хотим занести в таблицу новое животное мы будем брать запись по номеру seqId (минимальный номер у которого флаг isBlank = true), затем по этому номеру получать id (который и является уже заранее занесенным случайным числом, затем скидываем флаг isBlank в false и по этому id прописываем все данные на новое животное

я думал вы именно такой вариант предлагаете...
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060745
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixtanglir
Код: sql
1.
2.
3.
4.
select min(t1.id)
from tbl t1
join tbl t2 on t1.id=t2.id-1
where t1.id>463504 and t2.id is null



Благодарю!

Тут ещё ограничитель сверху до кучи

Код: sql
1.
2.
3.
select min(t1.id) nextId 
    from tbl a join tbl b on a.id = b.id - 1
    where a.id > 463504 and a.id < 999999 and b.id is null



собственно мой изначальный вопрос был в том, что существуют ли в мускуле какие-нибудь штатные инструменты для решения подобных задач? или рандомные айдишники - это только через клиента мутить? неужели мускул не дает в этом случае никаких рандомных инструментов?

PS. кстати, а просто для общего развития, что имелось ввиду под настоящий или псевдо-рандом?



не существует таких средств. поедите всего потому что они никому не нужны.

ключ должен быть уникальным, больше на него не надо накладывать никаких ограничений.

если ты делаешь ключ случайным, то ты навязываешь ему дополнительно еще какую то семантику помимо идентификации записи, а этого ключи не должны делать.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060749
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixпоэтому я думал вы предлагаете сразу в этой таблице создать 8999999 животныхТак тоже можно, наверное, но зависит от задачи.
Но я предлагал сделать отдельную табличку-генератор только из одних номеров. И черпать их оттуда по мере необходимости.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060763
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, ок, теперь понятно.

Код: sql
1.
2.
{nextId} = select id from random_id_list order by rand() limit 1;
delete from random_id_list where id = {nextId}
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060768
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixmiksoft, ок, теперь понятно.

Код: sql
1.
2.
{nextId} = select id from random_id_list order by rand() limit 1;
delete from random_id_list where id = {nextId}

Нет, тут уже order by rand() не нужен. Перемешивание должно было быть сделано один раз на этапе создания таблицы. Только поле id не надо делать первичным ключом, а то InnoDB записи отсортирует.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060843
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixв этой задаче важно новым животным присваивать номера случайным образом
Так мы увидим обоснование того, что ID должен быть СЛУЧАЙНЫМ?

С точки зрения логики, надо взять фразу
Lumixid будет распределен случайно, а вот seqId будет последовательным
и сделать строго наоборот.

LumixТут ещё ограничитель сверху до кучи
Код: sql
1.
2.
3.
select min(t1.id) nextId 
    from tbl a join tbl b on a.id = b.id - 1
    where a.id > 463504 and a.id < 999999 and b.id is null


Если есть свободные значения, но все они меньше 463504, приключится облом... таблицу надо завернуть в кольцо. Тогда если есть хотя бы одно незанятое значение - оно будет найдено.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060923
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЕсли есть свободные значения, но все они меньше 463504, приключится облом...
Lumixа каким запросом узнать первое несуществующее число больше 463504?Всё ч0тко по заданию. Если формулировка задания чего-то не учитывает - все претензии к ТСу :)
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39060932
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,
а какой физический смысл получения РАНДОМНОГО уникального числа в диапазоне?
Т.е. каково дальнейшее применение?
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061022
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovфизический смысл

Что означает термин физический смысл ?

Я от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом , а тут вы ещё какой-то физический смысл...

развели тут зоопарк терминов )

Alex_UstinovТ.е. каково дальнейшее применение?

Вместо того, чтобы создать новую запись с последовательным номером, мы создаем новую запись с этим рандомным номером.
Что-ж не понятного-то?

Ну например, если бы у нас таблице был бы автоинкемент, начинающийся от 100000 и было бы уж 500 животных, то если мы создавали обычным бы макром, то 501 животное получило бы номер 100501, а в нашем случае номер будет какой-нибудь типа 430564 или 676133, а животных все равно 501.

Есть же разница: либо у вас в клетке живет 5 попугаев 100354, 100355, 100356, 100357, 100403
или у вас в клетке живет 5 попугаев 156105, 679313, 456321, 546689, 901636.

Вот.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061070
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

вы ответьте без эмоций, пожалуйста.
авторНу например, если бы у нас таблице был бы автоинкемент, начинающийся от 100000 и было бы уж 500 животных, то если мы создавали обычным бы макром, то 501 животное получило бы номер 100501, а в нашем случае номер будет какой-нибудь типа 430564 или 676133, а животных все равно 501.

Есть же разница: либо у вас в клетке живет 5 попугаев 100354, 100355, 100356, 100357, 100403
или у вас в клетке живет 5 попугаев 156105, 679313, 456321, 546689, 901636.
Для меня нет разницы и для базы данных нет разницы кто у вас живет в клетке - попугай 100505 или 676133 и они от этого не подохнут )
Зачем именно РАНДОМНЫЕ "бирки"? обзовем их так (это точно не id в понятии СУБД)
Дальше для чего эта рандомность?
Если это просто так - так и скажите, "Это просто так"
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061088
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЯ от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом Это потому что я нестрого эти термины использовал - вообще-то даже то, что я называл настоящим рандомом по сути псевдорандом :)
"Настоящий" - это когда невозможно выявить закономерности в случайных данных, даже если эти закономерности НСД имеются в нашем ГСЧ. Насколько я знаю, большая часть ГСЧ в писюковых ЯП - это по сути псевдорандом. Сид у них ещё может быть по-настоящему случайным, а вот дальнейшая последовательность строго определена сидом. Хотя "на глаз" она вроде как случайна.
А "псевдо" - это когда метод генерации СЧ настолько хреновый, что эти закономерности видно, как говорится, невооружённым глазом.
Вот сравните ваш вариант (генерим разные СЧ пока не найдём незанятое) и предложенный вариант (берём наименьший из тех незанятых, что больше одного сгенерённого СЧ).
Допустим, заполнили мы половину имеющегося диапазона тем и другим методом, ну и что исходный ГСЧ - хороший, "настоящий". Так в первом случае распределение будет такое же, как у исходного ГСЧ - более-менее равномерное. А вот во втором случае у вас будет много непрерывных последовательностей, много дырок между ними и немножко отдельно стоящих чисел. То есть распределение будет не сказать чтобы такое уж случайное.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061093
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovЗачем именно РАНДОМНЫЕ "бирки"?

Потому что когда бирки слишком похожие, то очень часто сотрудники зоопарка путают особей между собой, особенно там, где плохая освещенность и размеры особей небольшие, а сами особи на внешний вид хрен отличишь между собой. Например, те же зеленые попугайчики отличаются тремя перышками и, конечно, вечером, уставшая баба Нюра в очках -3 может легко перепутать 100503 и 100505, даже если она очень ответственная женщина.

Перепутать 654321 и 467963 гораздо сложнее.
Мозгу физически труднее спутать эти два числа даже не читая их по отдельным цифрам.

Alex_Ustinov(это точно не id в понятии СУБД)

ой, а это где это вы это такое понятие СУБД встетили??
по мне так очень даже себе id...
просто видимо вы за всю жизнь привыкли, что айдишники всегда последовательные вот и не мыслите себе иную природу айдишников...
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061102
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirLumixЯ от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом Это потому что я нестрого эти термины использовал - вообще-то даже то, что я называл настоящим рандомом по сути псевдорандом :)
"Настоящий" - это когда невозможно выявить закономерности в случайных данных, даже если эти закономерности НСД имеются в нашем ГСЧ. Насколько я знаю, большая часть ГСЧ в писюковых ЯП - это по сути псевдорандом. Сид у них ещё может быть по-настоящему случайным, а вот дальнейшая последовательность строго определена сидом. Хотя "на глаз" она вроде как случайна.
А "псевдо" - это когда метод генерации СЧ настолько хреновый, что эти закономерности видно, как говорится, невооружённым глазом.
Вот сравните ваш вариант (генерим разные СЧ пока не найдём незанятое) и предложенный вариант (берём наименьший из тех незанятых, что больше одного сгенерённого СЧ).
Допустим, заполнили мы половину имеющегося диапазона тем и другим методом, ну и что исходный ГСЧ - хороший, "настоящий". Так в первом случае распределение будет такое же, как у исходного ГСЧ - более-менее равномерное. А вот во втором случае у вас будет много непрерывных последовательностей, много дырок между ними и немножко отдельно стоящих чисел. То есть распределение будет не сказать чтобы такое уж случайное.

я не совсем понял глубину вашего объяснения, но из всего что я понял, мне показалось, что вы утверждаете, что в выдаче

Код: sql
1.
select id from t order by rand() limit 250



невооруженным взглядом можно заметить закономерность...
либо вы Линус Торвальдс с лурки )
либо мои аналитические способности находятся на уровне хоббита с Флореса...
потому что для меня эти данные являются достаточно рандомными...
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061103
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixкогда бирки слишком похожиеЕсли визуальная схожесть в текстовом написании - это реальная причина, то такие вещи делаются другими способами.
...
Рейтинг: 0 / 0
Рандомный автоиндекс
    #39061114
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

я же просил без эмоций )
вы почитайте свой первоначальный вопрос.
Это id - в вашем контексте:
Код: sql
1.
create table t (id int not null auto_random_value(100000, 999999), primary key (id));


primary key (id) - это не поле для хранения "бирок"
когда вы это поймете - вопросов и к вам и ваших будет меньше.
а в моей жизни "id" вообще неприменимо, primary key (id) - Понятие СУБД
насчет "визульного" разброса можно было сразу озвучить
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Рандомный автоиндекс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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