За последние 24 часа нас посетили 18584 программиста и 1606 роботов. Сейчас ищет 1191 программист ...

Как выбрать случайный и уникальный ID в mysql

Тема в разделе "MySQL", создана пользователем rambap, 31 мар 2013.

  1. rambap

    rambap Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    25
    Симпатии:
    0
    В таблице есть поле orders_id
    в нём хранятся числовые id заказов в таком виде:

    29
    457
    3467844
    235
    2345
    33467899
    331136
    9272

    Т.е. случайные числа не по-порядку.
    Каким образом (с помощью запроса mysql) можно сгенерировать случайное число в диапазоне 10-10000000, которого НЕТ в поле (т.е. уникальное для этого поля)?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    вообще-то для этого придумали AUTOINCREMENT, но если ты не ищешь простых путей, то можно попытаться так:
    Код (Text):
    1. SELECT max(orders_id)+1 FROM hujnane_table
     
  3. rambap

    rambap Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    25
    Симпатии:
    0
    artoodetoo, я так понимаю этот запрос выберет поле с максимальным значением, прибавит 1 и возвратит? Мне это не подойдет. Нужно что-то вроде php функции mt_rand(10, 10000000); при условии что такого ID ещё нет в поле orders_id.

    Вот некоторые подробности по моей теме:

    Когда пользователь переходит на страницу заказа я должен сгенерировать уникальный ID заказа и вписать его в скрытое поле <input type='hidden' name='ornum' value='265895' /> на странице заказа.

    Этот ID я передаю биллингу, когда пользователь кликает "оплатить" и попадает на сайт биллинга.

    На стадии оформления заказа биллинг передаёт мне этот ID обратно в скрытый файл Result.php и, если все успешно я вписываю этот ID к себе в БД MySQL вместе с другой информацией по платежу.

    Теперь вопрос, если к примеру на сайте было 20 заказов, пользователь перешел на страницу заказа, я вписал в скрытое поле следующий незанятый ID - 21. В это время заказ начали оформлять ещё 5 пользователей - им тоже вписал скрытое поле ID - 21, ведь он ещё не занят (биллинг не обращался на Result.php и в БД этот ID не вписан). В результате я получу ситуацию когда в какой то момент пользователь оформлявший заказ, завершил его вписав ID 21 в БД. А следующий сразу за ним другой пользователь, тоже получивший ID 21 будет пытаться вписать в БД дублирующую запись и получит ошибку, если поле будет, как мне советуют auto_increment.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну или проверять и генерить, генерить и проверять...

    Добавлено спустя 2 минуты 21 секунду:
    дык вам надо сгенерить уникальный, а не найти такой, которого в базе нет. так вы и генерите =) uniqid() http://php.ru/manual/function.uniqid.html
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    действительно, клиент путается в показаниях! тебе точно нужно "случайное число, сгенерированное в mysql", или таки тебе нужен уникальный идентификатор?

    Добавлено спустя 26 минут 14 секунд:
    если ты используешь автоинкрементное поле ты гарантированно НЕ столкнешся с дубликатами. поверь, отцы и деды IT придумали этот тип специально для таких фокусов.

    Добавлено спустя 2 минуты 19 секунд:
    про max()+1 забудь, это была шутка, которую ты не оценил ;)