MySQL UPSERT: INSERT ON DUPLICATE KEY UPDATE
В MySQL командой INSERT ... ON DUPLICATE KEY UPDATE можно вставить строку или обновить её, если нарушается PRIMARY KEY или UNIQUE индекс. Для ожидаемого конфликта задайте уникальный ключ явно и проверяйте, какие столбцы обновляются.
Вставить или обновить запись по уникальному ключу
CREATE TABLE counters (
name varchar(100) PRIMARY KEY,
value int NOT NULL
);
INSERT INTO counters (name, value)
VALUES ('visits', 1)
ON DUPLICATE KEY UPDATE value = value + 1;При первом выполнении появится строка со значением 1, при следующем совпадении значение увеличится.
Обновить значение из входной строки
INSERT INTO counters (name, value)
VALUES ('visits', 5) AS incoming
ON DUPLICATE KEY UPDATE value = GREATEST(counters.value, incoming.value);В MySQL версии 8.0.19+ можно ссылаться на значения новой строки через row alias; проверьте синтаксис для установленной версии. VALUES(column) в новых версиях помечен устаревшим.
СУБД | Синтаксис upsert |
|---|---|
MySQL |
|
PostgreSQL |
|
Нужно ли сначала делать SELECT?
Обычно нет: upsert объединяет действия и снижает риск гонки между проверкой и вставкой. Обработка дедупликации всё равно зависит от уникального ограничения.