[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как исключить запись одинаковых значений в базу, у
Страницы: 1, 2, 3, 4, 5, 6
Sergey_555
Как реализовать следующее ?

Нужно исключить запись одинаковых значений в базу
Застрял на организации цикла с проверкой
В таблице в базе есть поле “kod”

1. Случайным образом генерируется число
2. Дальше сверяется есть ли уже такое значение в базе
3. Если есть увеличиваем это число на 1
4. Проверяем еще раз в базе
5. Если опять существует то пункт 3
6. Если совпадений нет то выполняем дальнейший код

Хотел вместо этого (генерация и сверка) использовать поле id, но мне нужно,
чтобы код был 9-ти значный и в полях записывался не в порядке счета как id (1,2,3,4,5…), а в перемешку.
Можно конечно каждый раз при совпадении перезагружать страницу, но уверен этого делать не стоит.
sergeiss
Сделай функцию в базе данных, которая будет это всё проделывать и возвращать уже готовое уникальное число.

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

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

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

user posted image
AllesKlar
если фраза "функция в базе данных" - это непонятный инопланетный язык smile.gif , то можно так закостылить:

1. Поле выставить с индексом unique
2. Генерировать 9-ти значное число с помощью microtime(), как значение берем 9 последних знаков.
3. Писать в базу чечрез блок try catch, если было выкинуто исключение, то генерируем число еще раз.

Таким образом, одинаковые числа (и соответсвенно, повторный запрос к базе) будут генерироваться очень редко

_____________
[продано копирайтерам]
F**k
Sergey_555, просто прибавь к id 123456789.
AllesKlar
Цитата (F**k @ 21.12.2014 - 16:34)
Sergey_555, просто прибавь к id 123456789.

Не подходит.

Цитата
не в порядке счета как id (1,2,3,4,5…), а в перемешку.


_____________
[продано копирайтерам]
inpost
А зачем такая задача? Давай сразу к конкретике)

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
F**k
del
andrey888
если вы обращаетесь к базе в цикле - то это не есть гуд. совсем не гуд.

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
mvg
Лучшим решением проблемы есть такое действие при котором данная проблема создаваться не будет :-). Например сделать id полем unique с autoincrement - точно повторений не будет и при прочих равных пробелы между значениями тоже будут не большими. Если очень хочется можно задать шестизначный формат поля.

Генерирование - запрос, проверка выбросило ли ошибку, нет ошибки ок, ошибка добавили единицу и еще пишем, проверка выбросило ли ошибку и т.п. Только если от 1 до 100 занято, а генератор выбросил 2, то это будет много запросов что неэффективно.

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


Может все-таки
id int(9) unique not null autoincrement
sergeiss
Граждане программисты, если человек говорит, что ему надо 9-значное уникальное число, то значит, что его и надо :) У меня тоже как-то была такая задача. И я ее решил как раз функцией в БД.

Но если без функции в БД, если ее нельзя сделать по какой-то причине, то можно вот как сделать.
Допустим, что то самое поле с 9-значным айди называется `id9`. Тогда генерим в ПХП набор из 10 уникальных чисел. Вставляем их в один запрос
select `id9` from `yourtable` where `id9` in ( 434579765, 234568154, 765483453, ......)

В списке указываем все эти 10 айди. При правильной организации БД запрос отработает быстро. А затем в ПХП смотрим результат, сравниваем полученный список айди (возможно, он будет пустой) с тем, что мы запросили. И выбираем первый из тех, что есть у нас в списке и которого нету в таблице.
Если вдруг окажется, что все 10 айди заняты, то повторяем процедуру, сгенерировав новый набор айди. Но можно утверждать, что с высокой степенью вероятности достаточно будет одного запроса для достаточно большого количества записей. 9 знаков - это числа от 100 млн. до 999 млн. Поэтому для количества записей даже в 1-2-3 млн. всегда будет достаточно одного запроса на айди, по указанному мной алгоритму.


И еще. Если этот айди будет 9-значный, но не числовой, а буквенно-числовой (пусть бы даже только английские буквы и все буквы в нижнем регистре), то общее количество вариантов еще больше возрастает. Тогда можно брать не 10 чисел в запросе, а меньше.

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

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

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

user posted image
Valick
Цитата
не 10 чисел в запросе, а меньше

там уже не числа biggrin.gif

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 22.12.2014 - 00:23)
там уже не числа

Ну не скажи... Шестнадцатиричное h4a56843b9 - это число же ведь? А почему, например, hyo47dr62j не может быть числом, только в другой системе измерения?

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

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

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

user posted image
Valick
sergeiss, шестнадцатеричные от A до F smile.gif

Цитата
А почему, например, hyo47dr62j не может быть числом, только в другой системе измерения?

тогда мы разговариваем числами, и мы все живём в матрице))

_____________
Стимулятор ~yoomoney - 41001303250491
Sergey_555
Цитата (andrey888 @ 21.12.2014 - 19:13)
если вы обращаетесь к базе в цикле - то это не есть гуд. совсем не гуд.

А как происходит поиск и выборка данных из базы ? Задаем необходимые критерии выбираем в массив. Затем из массива выводим в цикле (возможно мысли неправильно изложил).
Теперь представим ( возьмем к примеру любой сайт с высокой посещаемостью или форум).
Сколько обращений ?

Здесь же я обращаюсь 1 раз при поиске значения.
И еще раз если такое есть.
Учитывая что 9 символов это 900млн вариантов, а в базе наберется за долгое время не более 1млн, то шанс повторного обращения весьма мал.
Можно этого и вовсе не делать, но так я буду точно уверен, что не будет совпадения и будет произведена запись.

sergeiss
Sergey_555, если ты возьмешь в запросе не 1 значение, а больше (как я описал чуть ранее), то тогда с высокой вероятностью одного запроса достаточно будет.
По сути, мое решение отличается только тем, что сразу запрашиваем несколько чисел для проверки. Чтобы, в случае чего, не гонять в цикле запросы.

Цитата (Valick @ 22.12.2014 - 00:50)
тогда мы разговариваем числами, и мы все живём в матрице))

Поздравляю, земной объект номер 54АПДЫ43П! Ты наконец-то прозрел user posted image

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

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

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

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

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