Помогите с алгоритмом добавления в базу записи с уникальным именем. Например, хочу добавить запись у которой столбец name в значении 'banana'. Если такая запись уже есть, то сохранить её со значением name='banana-1', если есть и такая, то со значением name='banana-2' и т. д. Можно в цикле вытаскивать из базы записи (banan, banan-1,banan-2...) и если ничего не вернулось, обрывать цикл и добавлять свою запись с именем которое не вернулось. Однако, в этом случае получается от 2 до 100500 запросов к базе, и это плохо.
Не надо 100500 - достаточно одного запроса (mySQL): ... `имя` like 'banan%' order by `имя` desc limit 1 если номер формируется правильно (до 10 - 1-9, до 100 - 01-99 и т.д.). Или юзать REGEXP, чтобы получить имя с последним номером. п.с. Вообще, такая последовательная нумерация не надёжная - могут быть конфликты. Более надёжная, использовать алгоритм с блокированием номера.
Огромное спасибо! Вариант супер, просто и гениально. Немного не понял. Какие могут быть конфликты? И что Вы имели ввиду под "алгоритмом с блокированием номера"?
"Стандартные" конфликты. Два одновременных запроса получат один и тот же номер, в результате или два одинаковых имени или ошибка дублирования при уникальном индексе. Т.е. придётся это разруливать. Если таблица небольшая и число запросов небольшое (относительно), то лучше это поручить движку БД. MyISAM поддерживает автонумерацию составного индекса. В этом случае достаточно одного INSERT. (http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html) Есть разные алгоритмы блокирования значения. Например, автонумерация (AUTO_INCREMENT) использует один из них.
Спасибо. AUTO_INCREMENT только для целочисленных, поэтому для имени он мне не подойдет. Два одновременных запроса... думаю сделать уникальным и получая ошибку переформатировать имя и сохранять заново.