За последние 24 часа нас посетили 20773 программиста и 1714 роботов. Сейчас ищут 1662 программиста ...

Алгоритм уникального имени для записи в базе

Тема в разделе "Прочие вопросы по PHP", создана пользователем default53, 2 авг 2014.

  1. default53

    default53 Новичок

    С нами с:
    2 авг 2014
    Сообщения:
    7
    Симпатии:
    0
    Помогите с алгоритмом добавления в базу записи с уникальным именем.
    Например, хочу добавить запись у которой столбец name в значении 'banana'. Если такая запись уже есть, то сохранить её со значением name='banana-1', если есть и такая, то со значением name='banana-2' и т. д.

    Можно в цикле вытаскивать из базы записи (banan, banan-1,banan-2...) и если ничего не вернулось, обрывать цикл и добавлять свою запись с именем которое не вернулось. Однако, в этом случае получается от 2 до 100500 запросов к базе, и это плохо.
     
  2. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Не надо 100500 - достаточно одного запроса (mySQL):
    ... `имя` like 'banan%'
    order by `имя` desc
    limit 1
    если номер формируется правильно (до 10 - 1-9, до 100 - 01-99 и т.д.).
    Или юзать REGEXP, чтобы получить имя с последним номером.

    п.с. Вообще, такая последовательная нумерация не надёжная - могут быть конфликты. Более надёжная, использовать алгоритм с блокированием номера.
     
  3. default53

    default53 Новичок

    С нами с:
    2 авг 2014
    Сообщения:
    7
    Симпатии:
    0
    Огромное спасибо! Вариант супер, просто и гениально.
    Немного не понял. Какие могут быть конфликты? И что Вы имели ввиду под "алгоритмом с блокированием номера"?
     
  4. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    "Стандартные" конфликты. Два одновременных запроса получат один и тот же номер, в результате или два одинаковых имени или ошибка дублирования при уникальном индексе. Т.е. придётся это разруливать. Если таблица небольшая и число запросов небольшое (относительно), то лучше это поручить движку БД. MyISAM поддерживает автонумерацию составного индекса. В этом случае достаточно одного INSERT. (http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html)

    Есть разные алгоритмы блокирования значения. Например, автонумерация (AUTO_INCREMENT) использует один из них. :)
     
  5. default53

    default53 Новичок

    С нами с:
    2 авг 2014
    Сообщения:
    7
    Симпатии:
    0
    Спасибо. AUTO_INCREMENT только для целочисленных, поэтому для имени он мне не подойдет. Два одновременных запроса... думаю сделать уникальным и получая ошибку переформатировать имя и сохранять заново.