Sergey_555
22.12.2014 - 01:03
Цитата (mvg @ 21.12.2014 - 21:03) |
Лучшим решением проблемы есть такое действие при котором данная проблема создаваться не будет :-). Например сделать id полем unique с autoincrement - точно повторений не будет и при прочих равных пробелы между значениями тоже будут не большими. Если очень хочется можно задать шестизначный формат поля.
Генерирование - запрос, проверка выбросило ли ошибку, нет ошибки ок, ошибка добавили единицу и еще пишем, проверка выбросило ли ошибку и т.п. Только если от 1 до 100 занято, а генератор выбросил 2, то это будет много запросов что неэффективно.
Функция в БД может стать сложностью если юзаешь виртуальный хостинг потому что mysql для таких дел просит права рут, а хостеры таких прав обыкновенным клиентам не предоставляют.
Может все-таки id int(9) unique not null autoincrement |
Я рассматривал этот вариант.
Два автоинкремента не воткнешь, да и при уникум нужно проверять выдало ошибку или нет при записи, если такое уже есть.
Генерирование запрос да.
Что будет потом когда все числа будут использованы и все зациклится до бесконечности ?
Да ничего не будет.
Не будет в базе 900 млн записей ( при условии длины значения в 9 символов ), от силы за долгое время наберется менее 1 млн.
Да и зациклится до бесконечности сервер не даст, ошибку выдаст, связанную с превышением максимального времени исполнения и минуты не пройдет.
Sergey_555
22.12.2014 - 01:09
В общем решил так
$kod_gen = mt_rand(101, 149);
do {
$kod=++$kod_gen;
$result = mysql_query("SELECT kod FROM table_11 WHERE kod = '$kod_gen'");
$myrow= mysql_fetch_array($result);
}
while ($myrow['kod'] == $kod_gen);
$sql = mysql_query("INSERT INTO table_11 (kod) VALUES('".$kod_gen."')");
if ($sql) { echo 'Данные добавленны';}
else{echo 'Ошибка';}
AllesKlar
22.12.2014 - 01:17
божечки же ты мои... :blink:
Это ты не решил, это ты.. даже не знаю вот как сказать.
Мы тут мозги напрягаем, алгоритмы хитровывернутые предлагаем, количестов запросов к базе минимизируем, а ты вот так вот просто тупо перебором? Да еще поповщиной?
Ну мы же, в конце-концов, не женщины, чтобы нас послушать и сделать наоборот :)
Ты хотябы вот это чудо проверял?
$kod_gen = mt_rand(101, 149);
_____________
[продано копирайтерам]
Sergey_555
22.12.2014 - 01:18
PS:
Еденицу естественно можно не прибавлять, а генерировать новое.
Просто так подумал, что шансов попасть на последовательное число меньше, че сгенерируется такое же.
Хотя уверен, что это не правильно, шансов фифти фифти.
Sergey_555
22.12.2014 - 01:24
Да не спорю я с вами, нашли кого с кем сравнивать. Не дорос я до вас.
Вот и прошу варианты, а не напишите за меня.
А чудо работает

Знаю что это неразумный вариант, поэтому и не прошу тему закрыть.
sergeiss
22.12.2014 - 01:25
Цитата (AllesKlar @ 22.12.2014 - 01:17) |
Мы тут мозги напрягаем, алгоритмы хитровывернутые предлагаем, количестов запросов к базе минимизируем, а ты вот так вот просто тупо перебором? Да еще Поповщиной? |
Да ладно, не переживай

В жизни немало людей, которые не умеют слушать, поэтому не понимают то, что им говорят.
И кстати. Почему "Поповщина" с большой буквы? Слишком много чести тому, о ком идет речь
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
AllesKlar
22.12.2014 - 01:51
sergeissИсправил
Sergey_555Ну плохо проверял. Оно же выдает значения от 101 до 149
А дальше выбирай на вкус то, что предложили и перепиливай под себя.
_____________
[продано копирайтерам]
Sergey_555
22.12.2014 - 01:54
Цитата (sergeiss @ 22.12.2014 - 01:25) |
В жизни немало людей, которые не умеют слушать, поэтому не понимают то, что им говорят.
|
Почему сразу не слушают ? Я прекрасно понял ваше предложение
Цитата (sergeiss @ 22.12.2014 - 00:20) |
Допустим, что то самое поле с 9-значным айди называется `id9`. Тогда генерим в ПХП набор из 10 уникальных чисел. Вставляем их в один запрос
select `id9` from `yourtable` where `id9` in ( 434579765, 234568154, 765483453, ......) В списке указываем все эти 10 айди. При правильной организации БД запрос отработает быстро. А затем в ПХП смотрим результат, сравниваем полученный список айди (возможно, он будет пустой) с тем, что мы запросили. И выбираем первый из тех, что есть у нас в списке и которого нету в таблице. Если вдруг окажется, что все 10 айди заняты, то повторяем процедуру, сгенерировав новый набор айди. Но можно утверждать, что с высокой степенью вероятности достаточно будет одного запроса для достаточно большого количества записей. 9 знаков - это числа от 100 млн. до 999 млн. Поэтому для количества записей даже в 1-2-3 млн. всегда будет достаточно одного запроса на айди, по указанному мной алгоритму.
|
Но, как я писал выше не стоит сравнивать ваш уровень и мой, если для вас это просто, то мне необходимо время на поиск и осмысление дополнительной справочной информации.
Все с чего-то начинают.
Никого не хотел обидеть.
Sergey_555
22.12.2014 - 02:03
Цитата (AllesKlar @ 22.12.2014 - 01:51) |
Sergey_555 Ну плохо проверял. Оно же выдает значения от 101 до 149 |
Ну а что нужно было сразу указать 100000000 999999999 ?
Цитата (AllesKlar @ 22.12.2014 - 01:51) |
и перепиливай под себя. |
Так вот этим и занимаюсь
AllesKlar
22.12.2014 - 02:49
Sergey_555
Цитата |
Ну а что нужно было сразу указать 100000000 999999999 ? |
Ну, как бы да

Почему сомнения возникли?
_____________
[продано копирайтерам]
insert into table (id9) VALUES (TRUNCATE(rand()*pow(10,9),0))
где id9 - это UNIQUE KEY
и через try catch
andrey888
22.12.2014 - 09:06
Sergey_555 тебе выше правильно подсказывали.
Вообще для уникальных чисел всегда можно использовать индекс unique и уже потом брать это число из базы.
Если нужно обязательно генерить его в коде а уже потом сверять с базой - тогда time() ( или microtime() )
Если ты видишь на данный момент для себя единственную реализацию через твой вышенаписнный код - тогда еще раз повторю - запрос к базе включенный в цикл это плохо. и тогда уж использу вариант от sergeiss - генерируй сразу с десяток чисел а уж потом проверяй на существование в базе.
p.s. ты поясни для форумчан для чего тебе нужно делать униальное число в бд - возможно тебе подскажут более правильный подход.
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
AllesKlar
22.12.2014 - 09:18
andrey888
Цитата |
p.s. ты поясни для форумчан для чего тебе нужно делать униальное число в бд - возможно тебе подскажут более правильный подход. |
Вангую, что это коды для каких-либо акций.
_____________
[продано копирайтерам]
andrey888
22.12.2014 - 09:25
AllesKlar
Цитата |
чтобы код был 9-ти значный и в полях записывался не в порядке счета как id (1,2,3,4,5…), а в перемешку. |
вполне возможно
если Sergey_555 подтвердит - то у тебя отличные паранормальные способности )
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
andrey888
Цитата |
запрос к базе включенный в цикл это плохо |
Да что вы все, как заведенные. Плохо, плохо. Чем плохо? Или даже не так. Чем do... while хуже, чем try... catch или проверки кучи значений? Вот такой вариант:
do
{
mysql_query("INSERT IGNORE INTO table_11
SET kod = ". rand(100000000, 999999999)
);
}
while(mysql_affected_rows() < 1);
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.