@Stress-str

Если в БД есть запись «строка» — вставить запись «строка-1», если есть «строка-1» — вставить «строка-2»?

На ум приходит только цикл с постоянным сравниванием моей строчки и строками из бд.
Может у кого то есть решение поэлегантнее?
Поделитесь идеей
Спасибо
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 2
Fernus
@Fernus
Техник - Механик :)
Я бы немного изменил структуру, добавив одно дополнительное поле и уникальный индекс на поле name...
Короче...

Таблица:
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `count` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


При вставке записей использовал бы такой запрос:
INSERT INTO `test` (`name`) VALUES ('строка') 
ON DUPLICATE KEY 
UPDATE `count` = `count` + 1;


Что в итоге?

- В итоге не будет лишних объёмов данных в БД...
- Всего один запрос на вставку;
- В поле count будет число - сколько раз была занесена данная строка в БД...

UPDATE:

Исходя из комментариев и подробностей автора дополняю ответ...

Можно например использовать Redis (increment)...
Где ключ будет "строка" (в данном случае kot например).
Перед записью ныряем в Redis, подкручиваем "счётчик" и далее берем это значение и записываем в MySQL в поле slug:

kot-ЗНАЧНИЕ_СЧЁТЧИКА

В итоге один запрос в Redis и один INSERT в MySQL...

Понятна мысля?)

P.S.: Redis можно и на MySQL тож заменить...используя мой первый вариант в ответе в качестве счётчика вместо Redis'а...но тут на пару запросов больше выйдет...что и не критично в данном случае думаю...
Ответ написан
Периодически использую в Yii расширение Zelenin\yii\behaviors\Slug для генерации slug, но никогда не заглядывал "под капот" как оно там работает. Сейчас заглянул - автор в цикле добавляет к сгенерированному slug число и проверяет нет ли такой записи в таблице.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы