MySQL UPSERT: INSERT ON DUPLICATE KEY UPDATE

Категория: Postgresql · Язык: SQL · Обновлено:

В MySQL командой INSERT ... ON DUPLICATE KEY UPDATE можно вставить строку или обновить её, если нарушается PRIMARY KEY или UNIQUE индекс. Для ожидаемого конфликта задайте уникальный ключ явно и проверяйте, какие столбцы обновляются.

Вставить или обновить запись по уникальному ключу

SQL
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, при следующем совпадении значение увеличится.

Обновить значение из входной строки

SQL
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

ON DUPLICATE KEY UPDATE

PostgreSQL

ON CONFLICT (...) DO UPDATE

Нужно ли сначала делать SELECT?

Обычно нет: upsert объединяет действия и снижает риск гонки между проверкой и вставкой. Обработка дедупликации всё равно зависит от уникального ограничения.