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

Статус
В этой теме нельзя размещать новые ответы.

default

Новичок
Пытаюсь придумать алгоритм добавления записи в mysql базу с уникальным именем. Например, добавляю запись в которой столбец name в таблице с записями принимает значение 'apple'.
Код:
"INSERT INTO posts SET name='apple' "
Если уже существует запись в которой столбец name в значении 'apple', то нужно добавлять запись с именем 'apple-1'. И вроде всё просто, сначала запрашиваю статью с именем 'apple', если её нахожу, то добавляю с именем 'apple-1', если нет - с именем 'apple'. Однако, статья с именем 'apple-1' тоже может быть (и с именем 'apple-2','apple-3'...) в базе...
В голову приходит только один вариант запрашивать статьи из базы в цикле (apple, apple-1, apple-2...), обрывая этот цикл, если совпадений в базе не найдено.

Такой вариант считаю не рациональным (много обращений к базе). Подскажите, пожалуйста, решение моей проблемы.
 

default

Новичок
А разве можно varchar столбцу задавать auto_increment? У меня не получается (да и не должно), получаю #1063 - Incorrect column specifier for column
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
default, сделать автоинкрементное поле - id, и поле name, куда писать названия. А вот потом к названию добавлять через дефис уже значене id, запись будет 100% уникальной. Вытаскивать статью по id, то есть если у тебя формат записи будет name-id - ты отрезаешь то, что идет после дефиса и ишешь SELECT * FROM table WHERE id = значение после дефиса.
 

default

Новичок
default, сделать автоинкрементное поле - id, и поле name, куда писать названия. А вот потом к названию добавлять через дефис уже значене id, запись будет 100% уникальной.
Спасибо, интересный способ. Тут тоже есть некоторые нюансы:
1) Нужно делать минимум 2 запроса: 1 - добавить запись, 2 - изменить имя (ведь при добавлении записи, id ещё не известен).
2) Стремные имена))) Если в базе 100500 записей я получу имя 'apple-100501', а хотелось бы 'apple-1'
Однако, алгоритм лучше, чем в цикле обращаться к базе.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
default, не надо ничего изменять, ты при выводе на странице делаешь конкатенацию имени и id записи. Есть очень много подходов к формированию имен для записей, все ограничено только знаниями и фантазией.
 

Kotofey

FloodMaster.
Мое предложение так сделать один запрос SELECT .... WHERE name LIKE 'apple%'
И в цикле обрабатывать, если пустой результат выборки вставить просто apple, если не пустой то посчитать количество результатов и вставить 'apple'.$countResult+1
 

WMix

герр M:)ller
Партнер клуба
Kotofey,
посчитать количество результатов и вставить 'apple'.$countResult+1
1. добавили 'apple'.$countResult+1 (apple1)
2. добавили 'apple'.$countResult+1 (apple2)
3. удалили apple1
4. добавили 'apple'.$countResult+1 (apple?)
кстати apple-sweet-and-green тоже нормальное название
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Автору бы хоть как-нибудь сделать то, о чем тут раписали.
 

default

Новичок
Спасибо!
SELECT .... WHERE name LIKE 'apple%'
примерно по этому алгоритму сделал, только с регулярным выражением. Потом перебираю в цикле значения от 'apple-1' до первого несовпадения с тем что пришло из базы (перед этим конечно же ещё и 'apple' проверяю).
Вот код на котором остановился.
Код:
$name='apple';
$whiskey = $db->query("SELECT * FROM posts WHERE field_name REGEXP 'apple-?[0-9]*'");
if ($whiskey) {
         while($row = $whiskey->fetch_assoc()) {
           if(isset($row['field_name'])) $arr_names[] = $row['field_name'];
         }
}
if(in_array($name, $arr_names)) {
       $flug = true;
       $i=1;
       while($flug) {
            $i++;
            if(!in_array($name."-".$i, $arr_names)) {
              $name = $name."-".$i;
              $flug = false;
            }
       }
}
echo $name;
Если нет нареканий по коду, думаю тему можно закрывать...
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху