Все ленты — последние статьи

Как в MySQL при наличии некоторых данных изменить их, а при отсутствии — добавить?

Как в MySQL при наличии некоторых данных изменить их, а при отсутствии — добавить?

Зачастую возникают ситуации, когда нужно при наличии определенной строки в таблице в MySQL изменить ее, а при ее отсутствии — добавить. Обычно решают такую задачу в два приема: сначала проверяют, есть ли данные (SELECT с нужными условиями), а затем в зависимости от полученного результата либо изменяют их (UPDATE), либо добавляют (INSERT).

 

Конструкция получается достаточно трудоемкая. В этом случае будет эффективнее использовать команду MySQL REPLACE. По синтаксису она эквивалентна INSERT:
REPLACE [LOW_PRIORITY DELAYED]
[INTO] tbl_name [(col_name,…)]
VALUES (expression,…),(…),…
или REPLACE [LOW_PRIORITY DELAYED]
[INTO] tbl_name [(col_name,…)]
SELECT …
или REPLACE [LOW_PRIORITY DELAYED]
[INTO] tbl_name
SET col_name=expression, col_name=expression,…

Логика работы REPLACE такова: если в существующей строке есть поле, для которого построен индекс типа PRIMARY KEY или UNIQUE, с тем же значением, что и в новой строке, то старая строка удаляется, а новая — добавляется. Если строки с таким значением в указанном поле нет, то строка просто добавляется.

Есть еще вариант с использованием ON DUPLICATE KEY UPDATE:
INSERT [LOW_PRIORITY DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,…)]
VALUES (expression,…),(…),…
[ ON DUPLICATE KEY UPDATE col_name=expression, … ]
или INSERT [LOW_PRIORITY DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,…)]
SELECT …
или INSERT [LOW_PRIORITY DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=(expression DEFAULT), …
[ ON DUPLICATE KEY UPDATE col_name=expression, … ]

Если вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки. Например:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

Если a определяется как UNIQUE и уже содержит 1, то тогда вышеуказанная команда будет аналогична следующей:
UPDATE table SET c=c+1 WHERE a=1;