[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как исключить запись одинаковых значений в базу, у
Страницы: 1, 2, 3, 4, 5, 6
Sergey_555
Цитата (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
В общем решил так

$kod_gen = mt_rand(101, 149); // диапазон на выбор 100000000, 999999999
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
божечки же ты мои... :blink:
Это ты не решил, это ты.. даже не знаю вот как сказать.

Мы тут мозги напрягаем, алгоритмы хитровывернутые предлагаем, количестов запросов к базе минимизируем, а ты вот так вот просто тупо перебором? Да еще поповщиной?

Ну мы же, в конце-концов, не женщины, чтобы нас послушать и сделать наоборот :)

Ты хотябы вот это чудо проверял?
$kod_gen = mt_rand(101, 149); // диапазон на выбор 100000000, 999999999


_____________
[продано копирайтерам]
Sergey_555
PS:
Еденицу естественно можно не прибавлять, а генерировать новое.
Просто так подумал, что шансов попасть на последовательное число меньше, че сгенерируется такое же.
Хотя уверен, что это не правильно, шансов фифти фифти.
Sergey_555
Да не спорю я с вами, нашли кого с кем сравнивать. Не дорос я до вас.
Вот и прошу варианты, а не напишите за меня.
А чудо работает biggrin.gif Знаю что это неразумный вариант, поэтому и не прошу тему закрыть.
sergeiss
Цитата (AllesKlar @ 22.12.2014 - 01:17)
Мы тут мозги напрягаем, алгоритмы хитровывернутые предлагаем, количестов запросов к базе минимизируем, а ты вот так вот просто тупо перебором? Да еще Поповщиной?

Да ладно, не переживай smile.gif В жизни немало людей, которые не умеют слушать, поэтому не понимают то, что им говорят.
И кстати. Почему "Поповщина" с большой буквы? Слишком много чести тому, о ком идет речь smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
sergeiss
Исправил smile.gif

Sergey_555
Ну плохо проверял. Оно же выдает значения от 101 до 149

А дальше выбирай на вкус то, что предложили и перепиливай под себя.

_____________
[продано копирайтерам]
Sergey_555
Цитата (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
Цитата (AllesKlar @ 22.12.2014 - 01:51)

Sergey_555
Ну плохо проверял. Оно же выдает значения от 101 до 149

Ну а что нужно было сразу указать 100000000 999999999 ?

Цитата (AllesKlar @ 22.12.2014 - 01:51)

и перепиливай под себя.

Так вот этим и занимаюсь
AllesKlar
Sergey_555
Цитата
Ну а что нужно было сразу указать 100000000 999999999 ?

Ну, как бы да smile.gif Почему сомнения возникли?

_____________
[продано копирайтерам]
depp
insert into table (id9) VALUES (TRUNCATE(rand()*pow(10,9),0))

где id9 - это UNIQUE KEY
и через try catch
andrey888
Sergey_555 тебе выше правильно подсказывали.
Вообще для уникальных чисел всегда можно использовать индекс unique и уже потом брать это число из базы.
Если нужно обязательно генерить его в коде а уже потом сверять с базой - тогда time() ( или microtime() )
Если ты видишь на данный момент для себя единственную реализацию через твой вышенаписнный код - тогда еще раз повторю - запрос к базе включенный в цикл это плохо. и тогда уж использу вариант от sergeiss - генерируй сразу с десяток чисел а уж потом проверяй на существование в базе.

p.s. ты поясни для форумчан для чего тебе нужно делать униальное число в бд - возможно тебе подскажут более правильный подход.

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
AllesKlar
andrey888
Цитата
p.s. ты поясни для форумчан для чего тебе нужно делать униальное число в бд - возможно тебе подскажут более правильный подход.

Вангую, что это коды для каких-либо акций.

_____________
[продано копирайтерам]
andrey888
AllesKlar smile.gif
Цитата
чтобы код был 9-ти значный и в полях записывался не в порядке счета как id (1,2,3,4,5…), а в перемешку.

вполне возможно
если Sergey_555 подтвердит - то у тебя отличные паранормальные способности )

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
twin
andrey888
Цитата
запрос к базе включенный в цикл это плохо
Да что вы все, как заведенные. Плохо, плохо. Чем плохо? Или даже не так. Чем do... while хуже, чем try... catch или проверки кучи значений? Вот такой вариант:
    do
{
mysql_query("INSERT IGNORE INTO table_11
SET kod = "
. rand(100000000, 999999999)
);

}
while(mysql_affected_rows() < 1);


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.