Курилка.co.ua
Orphus RSS kurilka.co.ua

Category

Archives

Обновление дублирующих при добавлении данных в MySQL

Author wmas wmas | Category Category MySQL

Здравствуйте, уважаемые посетители моего блога Курилка.co.ua. Работая над оптимизацией количества запросов к базе данных, я не перестаю удивляться широким возможностям MySQL. Простая задачка: в некую таблицу добавляются (INSERT) уникальные данные, в случае появления дубликата необходимо обновить (UPDATE) значение счетчика. Получается как минимум два запроса, но можно обойтись всего одним, используя в INSERT конструкцию ON DUPLICATE KEY UPDATE. Об этом подробней.

Для наглядности, приведу пример такой простой таблицы:

CREATE TABLE table (
  a int(11) NOT NULL default '0',
  b int(11) NOT NULL default '0',
  c int(11) NOT NULL default '0',
  UNIQUE KEY (a)
);

Если в INSERT вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), то вставка дублирующего первичного (PRIMARY) или уникального (UNIQUE) ключа, приведет к выполнению UPDATE старой строки. Например:

INSERT INTO table SET a=1,b=2,c=1 ON DUPLICATE KEY UPDATE c=c+1

Если в таблице содержится строка, значение поля a которой равно единице, то выше указанный запрос будет аналогичен следующему:

UPDATE table SET c=c+1 WHERE a=1

В случае наличие нескольких уникальных (UNIQUE) ключей, например a и b, они будут объединены через OR. Причем обновляться будет только первое совпадение. Другими словами, мы получим следующий аналог:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1

Если необходимо объединение через AND, достаточно определить два поля как один уникальный ключ, т.е.:

UNIQUE KEY d (a,b)

Ну, вот и всё. Надеюсь, мне удалось объяснить всё более-менее понятно и доступно. Уточню лишь, что такая конструкция считается не слишком надежной, но у меня вроде работает. Смотрите сами и если есть вопросы, уточнения, поправки и т.п. – пишите, будем разбираться. Спасибо за внимание.

Publish: Понедельник Янв 18, 2010

2 Responses for "Обновление дублирующих при добавлении данных в MySQL"

feed for comments on this post

  • Комментарий #2546 author: Vect0r Reply (subscribed to comments)
    publish: Вторник Янв 19, 2010 at 9:39 дп

    Недавно столкнулся с такой же задачей в MySQL. Решил её, использовав REPLACE. В рассмотренном случае получится примерно следующее:

    REPLACE table SET c=c+1, a=1, b=2

    То есть условно говоря, мы заменяем слово UPDATE на слово REPLACE и в случае, когда такой записи не будет найдено в БД, она будет создана, а если запись с такими уникальными ключами уже существует, то она будет обновлена.
    Не знаю, правда, с какой версии MySQL она работает — у меня 5.0.45 в Денвере, пока только там использовал.

  • Комментарий #2547 author: wmas Reply
    publish: Вторник Янв 19, 2010 at 9:37 пп

    2Vect0r: Привет Виктор. Тоже вариант решения, но есть и свои различия. Дело в том, что конструкция INSERT… ON DUPLICATE KEY UPDATE… производит вставку или обновление, а вот REPLACE производит обновление за счет удаления дубликата строки и вставки (INSERT) новой строки.

    Насчет того, что эффективней сказать затрудняюсь, но как по мне REPLACE выполняет лишние телодвижения ;-)


Popular links

Copyright © since 2006 Курилка.co.ua,
powered by WordPress