Обновление дублирующих при добавлении данных в 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)
Ну, вот и всё. Надеюсь, мне удалось объяснить всё более-менее понятно и доступно. Уточню лишь, что такая конструкция считается не слишком надежной, но у меня вроде работает. Смотрите сами и если есть вопросы, уточнения, поправки и т.п. – пишите, будем разбираться. Спасибо за внимание.