like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей

Как сделать чтобы при вставке значения, первое из дублирующихся значений вставлялось, а все последующие обновлялись?

Господа, как сделать чтобы при совпадении значения, первое из дублирующихся значений вставлялось, а все последующие апдейтились?

Консутрукция
INSERT INTO ... VALUES
...
ON DUPLICATE KEY UPDATE example=VALUES(example2)

апдейтит первый из дублей, остальные просто игнорируются
  • Вопрос задан
  • 2494 просмотра
Решения вопроса 1
@bobzer
Java EE Developer
1. Можно попробовать триггеры с вашей специфической логикой: создаёте триггер на insert/update в таблицу, а внутри него крутите любую бизнес-логику. Если СУБД развернута на более-менее приличных серверах, то 1-10 млн. операций в сутки пройдет без перенапряжения.

2. Делать работу в коде - открыли транзакцию, и на вашем ЯП читаете/вставляете/обновляете записи в БД, по окончании завершаете транзакцию. Нагрузка чуть больше, чем в п.п. 1, но при грамотном "общении" с СУБД тоже не так уж и велика.

3. Разбираетесь, почему у вас дубликаты в БД, читаете мануалы по нормализации данных в СУБД, просите проанализировать структуру спецов. После один раз напрягаетесь чтобы сделать нормальную структуру БД, зато потом работаете с БД "правильно" а не путем применения специфических функций (выходящих за рамки стандарта SQL 2008 (обычно хватает стандарта 92-го года))...

Вот триггер:
CREATE TRIGGER wc_terms_unique_slug
BEFORE INSERT ON wc_terms FOR EACH ROW
BEGIN
declare
countDoubles int;

select count(*) into @countDoubles from wc_terms
    where slug = NEW.slug or slug REGEXP CONCAT('(^', NEW.slug, ')([\-])([0-9]+)$');
if(@countDoubles > 0) then
    SET NEW.slug = CONCAT_WS('-', NEW.slug, @countDoubles + 1);
end if;

END;

После его создания делаете обычные insert-ы (без ON DUPLICATE KEY)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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